1. 程式人生 > >資料結構六:二叉樹的先序建樹與中序的非遞迴遍歷演算法

資料結構六:二叉樹的先序建樹與中序的非遞迴遍歷演算法

         熟悉二叉樹的遍歷建樹過程有利於對後文線索化二叉樹的學習

         對於資料結構中二叉樹特殊的結構,經過一段時間的溫習發現自己基礎並不是很牢靠,所以寫下這篇博文也是記錄一下自己的學習過程,給日後參考

#include <stack>
#include <iostream>
using namespace std;

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//按給定的先序序列建立二叉連結串列
BiTNode* BiTree_Creat12()
{
	BiTNode *tmp = NULL;
	char ch;
	printf("\n請輸入字元: ");
	cin >> ch ; 
	if (ch == '*')
	{
		return NULL;
	}
	else
	{
		tmp = (BiTNode *)malloc(sizeof(BiTNode));
		if (tmp == NULL)
		{
			return NULL;
		}
		else
		{
			tmp->data = ch; //生成根結點
			tmp->lchild = BiTree_Creat12();//構建左子樹
			tmp->rchild = BiTree_Creat12();//構建右子數
			return tmp;
		}
		
	}

}


//非遞迴遍歷二叉樹左子樹
BiTNode* GoLeft(BiTNode* node, stack<BiTNode*>& mstack)
{
	if (node == NULL)
	{
		return NULL;
	}
	else
	{
		while (node->lchild != NULL)
		{
			mstack.push(node);
			node = node->lchild;

		}

	}
	return node;
}

void InOrder(BiTNode* node)
{
	stack<BiTNode*> stack;
	node = GoLeft(node, stack);
	while (node != NULL)
	{
		//如果節點的左子樹為空 就訪問該節點
		printf("%c\t", node->data);
		//判斷右子樹是不是為空   就遍歷右子樹
		if (node->rchild != NULL)
		{
			node = GoLeft(node->rchild, stack);
		}
		else if (!stack.empty())
		{
			//右子樹為空 就出棧返回操作
			node = stack.top();
			stack.pop();
		}
		else
		{
			//右子樹為空 棧也為空 訪問結束
			node = NULL;
		}

	}

}



void main()
{
	int nCount = 0, depthval = 0;
	BiTNode * my = BiTree_Creat12();
	printf("\n非遞迴演算法c++訪問\n");
	InOrder(my);

	printf("\n邵忠棋");
	system("pause");
}