标签:style blog ar color os sp on div log
1.首先是二叉树的建立
先序递归建立一个 建立一个二叉树 用#表示空
void CreatTree(BitNode **root) { char ch; scanf("\n%c",&ch); if(ch == ‘#‘) *root = NULL; else { *root = (BitNode *)malloc(sizeof(BitNode)); (*root)->data = ch; printf("%cleft child:",ch); CreatTree(&(*root)->lchild); printf("%cright child:",ch); CreatTree(&(*root)->rchild); } }
2. 运用递归的思想遍历二叉树, 这种方法最为简单。
void PreOrder(BitNode *root) { if(root == NULL) { return; } printf("%c ",root->data); PreOrder(root->lchild);
PreOrder(root->rchild); }
3.借助栈 可以实现非递归方法
思路: 按照我们的遍历方法走二叉树
1) 一直向左 (至叶子节点-> 左右都是NULL)
2) 弹栈 回退一个节点 向右走一步后继续 ( 再重复 1~2 步骤至栈空)
//前序非递归
void PreOrder_Nonrecrusive(pBittree T) { if(!T) return ; stack<pBittree> s; pBittree p= T; while(p != NULL || !s.empty()) { while(p != NULL) { cout << p->data << " "; s.push(p); p = p-> lchild; } if(!s.empty()) { p = s.top(); s.pop(); p = p->rchild; } } }
后续非递归:
遍历过程相似:
因为后续非递归方法是先访问左子树,再访问右子树,最后访问根节点,用栈储存时必须分清反悔跟节点是做还是右,所以需要一个辅助指针r;指向其最近访问节点。 也可增加一个标识域;
void PostOrder_Nonrecresive(pBittree T) { stack<pBittree> s; pBittree p = T, r = NULL, temp; while(p || !s.empty()) { if(p) { s.push(p); p = p->lchild; } else { p = s.top(); if(p->rchild && p->rchild != r ) { p = p->rchild; s.push(p); p = p->lchild; } else { p = s.top(); s.pop(); cout << p->data << " "; r = p; p = NULL; } } //else } //while }
标签:style blog ar color os sp on div log
原文地址:http://www.cnblogs.com/yvesfan/p/4158849.html