二叉树遍历的非递归形式,主要是依靠 栈 来实现的:
对于二叉树的先序遍历,先将根结点压入栈中,然后将树中所有的左子树压入栈中同时访问其值,对于最后一个左子树压入栈中后,它的左子树为NULL ;访问它的右子树,并从栈中将其退出,再以它的右子树为根结点的形式进行访问,当栈中元素第一次全部清空之后,若根结点的右子树不为空,继续进行进栈操作,直到栈再次为空且右子树为NULL时结束;
#include<iostream> #include<stdio.h> #include<stack> #include<string.h> #include<stdlib.h> using namespace std ; struct Node { int data ; Node *left ; Node *right ; }; Node* newnode() { Node *root = new Node ; root->left = NULL ; root->right = NULL ; return root ; }; int main() { Node *root = newnode() ; char s[100] ; while(cin >> s ) { Node *t = root ; if(strcmp(s,"()") == 0 ) break ; int data ; sscanf(&s[1],"%d",&data); char *s1 = (strchr(s,‘,‘)+1) ; int len = strlen(s1) ; for(int i = 0 ; i < len ; i++) { if(s1[i] == ‘L‘) { if((t->left) == NULL) t->left = newnode() ; t = t -> left ; } else if(s1[i] == ‘R‘) { if((t->right) == NULL) t->right = newnode() ; t = t -> right ; } } t -> data = data ; } stack<Node*> ss ; Node *r = root ; while((!ss.empty())||r!=NULL) { while(r != NULL) { cout << r->data << " "; ss.push(r); r = r->left ; } r = ss.top() ; r = r->right ; ss.pop(); } cout << endl ; return 0 ; }
二叉树先序、中序、后续遍历(非递归实现),布布扣,bubuko.com
原文:http://blog.csdn.net/ding_hai_long/article/details/21104081