二叉树的前序、中序、后序的非递归遍历

来源:互联网 发布:insert into 跨数据库 编辑:程序博客网 时间:2024/05/16 11:08

二叉树的数据结构:

typedef int ElementType;
typedef struct Node{ElementType data;Node *left;Node *right;}Node, *Root;

二叉树的遍历是非常重要的树操作,按照节点遍历的顺序,可以分为前序、中序、后序和层次遍历,遍历算法用递归方法实现非常清晰,但是实际应用时采用递归很容易造成堆栈溢出,因此非递归遍历算法就显得非常重要。

非递归其实和递归的原理是一样的,用栈来保存节点信息。


前序遍历(这里用printf来表示对节点信息的访问)

void PreOrderTraverse(Root root){Node temp = root;stack<Node> S;while(temp || !S.empty()){if(temp){S.push(temp);printf("%d", temp->data);//遍历到子树根节点,立即访问temp = temp->left;//一直向左遍历左孩子}else{temp = S.top();S.pop();temp = temp->right;//根节点和左子树都访问过了,接着访问右子树}}}


中序遍历:

void InOrderTraverse(Root root){Node temp = root;stack<Node> S;while(temp || !S.empty()){if(temp){S.push(temp);temp = temp->left;//一直向左遍历左孩子}else{temp = S.top();printf("%d", temp->data);S.pop();temp = temp->right;//根节点和左子树都访问过了,接着访问右子树}}}

后序遍历:

void PostOrderTraverse(Root root){Node temp = root;Node pre = NULL;stack<Node> S;while(temp || !S.empty()){if(temp){S.push(temp);temp = temp->left;//一直将左孩子入栈}else{if(S.top()->right && pre != S.top()->right)//如果该节点有右子树,且并未访问过,则首先遍历右子树temp = S.top()->right;else//若该节点没有右子树,或者右子树已经被访问过,则输出当前节点{printf("%d", S.top()->data);pre = S.top();//pre记录被访问的前一个节点S.pop();//被访问过的节点出栈}}}}

层次遍历(顾名思义,就是按照数的层次从左到右进行遍历):

void GraTraverse(Root root){Node temp = root;queue<Node> Q;while(temp || !Q.empty()){printf("%d", temp->data);if(temp->left)//访问节点后将节点的左孩子和右孩子分别入队Q.push(temp->left);if(temp->right)Q.push(temp->right);temp = Q.front();//从队头取下一个访问节点Q.pop();}}




0 0
原创粉丝点击