二叉树的遍历

typedef struct BiTree* Node;

typedef struct BiTree* Tree;

struct BiTree

{

 int Element;

 Node Left;

 Node Right;

 bool isFirst; //从下向上出栈过程中,第一次出现在栈顶

};

 

 

//先序遍历, 递归

void TraverseTreePreOrder(Tree T)

{

 if(T != NULL)

 {

 cout<<T->Element<<" ";

 TraverseTreePreOrder(T->Left);

 TraverseTreePreOrder(T->Right);

 }

}

 

//中序遍历, 递归

void TraverseTreeInOrder(Tree T)

{

 if(T != NULL)

 {

 TraverseTreeInOrder(T->Left);

 cout<<T->Element<<" ";

 TraverseTreeInOrder(T->Right);

 }

}

 

//后序遍历,递归

void TraverseTreePostOrder(Tree T)

{

 if(T != NULL)

 {

 TraverseTreePostOrder(T->Left);

 TraverseTreePostOrder(T->Right);

 cout<<T->Element<<" ";

 }

}

 

//先序遍历. 非递归

void TraverseTreePreOrder2(Tree T)

{

 stack<Node> Stack;

 while(T!= NULL && !Stack.empty()) //每进行一次while,都是从左儿子到右儿子

 {

 while(T != NULL) //一直遍历最左边的节点

 {

 cout<<T->Element<<" ";

 Stack.push(T);

 T = T->Left;

 }

 //如果遍历到底了,就向上一层, 遍历右儿子

 T =Stack.top(); 

 T = T->Right; 

 Stack.pop(); 

 

 }

}

 

//中序遍历, 非递归

void TraverseTreeInOrder2(Tree T)

{

 stack<Node> Stack;

 while(T!= NULL && !Stack.empty())

 {

 while(T != NULL)

 {

 Stack.push(T); 

 T = T->Left;

 }

 T = Stack.top;

 Stack.pop();

 cout<<T->Element<<" ";

 T = T->Right;

 }

}

 

//后序遍历, 非递归

void TraverseTreePostOrder(Tree T)

{

 stack<Node> Stack;

 while(T != NULL && !Stack.empty())

 {

 while(T != NULL)

 {

 Stack.push(T);

 T->isFirst = true; //所有节点在初始入栈时都会在此被设为true.

 T = T->Left;

 }

 T = Stack.top();

 //Stack.pop();

 if(T->isFirst) //左节点被遍历完,准备向右节点遍历时

 {

 T->isFirst = false;

 //Stack.push(T);

 T = T->Right;

 }

 else //右节点被遍历完,又回到这个节点,准备走向父节点

 {

 Stack.pop();

 cout<<T->Element<<" ";

 T = NULL:

 }

 

 }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容