PS:对于递归实现的前序,中序,后序算法,无非是在递归时,根的访问位置不同而已,代码内容几乎相似。非递归算法实现时,当root指针或栈非空时,先循环考虑root是否为否执行相应的操作,对于栈判断是否为空,进行root的转换。前序,后序,中序的非递归算法区别无非是每棵树的根节点的输出时机不同而已,具体实现大同小异。
1.二叉树的前序遍历-------------------非递归实现算法(伪代码)和递归实现
非递归实现伪代码:
1.栈s初始化(空栈); 2.循环直到root为空且栈s为空 2.1 当root不空时循环 2.1.1 输出root->data; 2.1.2 将指针root的值保存到栈中; 2.1.3 继续遍历root的左子树(root=root->lchild) 2.2 如果栈s不空,则 2.2.1 将栈顶元素弹出至root(root=s.pop()); 2.2.2 准备遍历root的右子树(root=root->rchild);
代码:
template <class T> void BiTree::PreOrder(BiNode<T> *root) { SeqStack<BiNode<T> *> s; while (root!=NULL | | !s.empty()) { while (root!= NULL) { cout<<root->data; s.push=root; root=root->lchild; } if (!s.empty()) { root=s.pop(); root=root->rchild; } } }
递归实现:
template <class T> void BiTree::PreOrder(BiNode<T> *root) { if (root ==NULL) return; else { cout<<root->data; PreOrder( root->lchild ); PreOrder( root->rchild); } }
2.二叉树的建立伪代码:
1.按前序扩展遍历序列输入输入节点的值
2.如果输入节点之为“#”,则建立一棵空的子树
3.否则,根结点申请空间,将输入值写入数据域中,
4.以相同方法的创建根节点的左子树
5.以相同的方法创建根节点的右子树
递归方法
代码:
template <class T> BiTree ::BiTree(){ root=creat(); } template <class T> BiNode<T> * BiTree ::Creat(){ BiNode<T> *root; char ch; cin>>ch; if (ch=='# ') root=NULL; else { root=new BiNode<T>; root->data=ch; root->lchild=creat(); root->rchild= creat(); } return root }
3.
中序遍历---------递归算法
template <class T> void BiTree::InOrder (BiNode<T> *root) { if (root==NULL) return; else { InOrder(root->lchild); cout<<root->data; InOrder(root->rchild); } }
中序遍历--------非递归算法(伪代码):
1.栈s初始化(空栈); 2.循环直到root为空且栈s为空 2.1 当root不空时循环 2.1.1 将指针root的值保存到栈中; 2.1.2 继续遍历root的左子树(root=root->lchild) 2.2 如果栈s不空,则 2.2.1 将栈顶元素弹出至root(root=s.pop()); 2.2.2 输出root->data; 2.2.3 准备遍历root的右子树(root=root->rchild);
代码:
template <class T> void BiTree::InOrderwithoutD(BiNode<T> *root) { stack< BiNode<T> * > aStack; while (!aStack.empty() || root) { while (root) { aStack.push(root); root = root->lchild; } if (!aStack.empty()) { root = aStack.top(); aStack.pop(); cout << root->data; root = root->rchild; } } }
4.
后序遍历-----------递归算法
template <class T> void BiTree::PostOrder(BiNode<T> *root) { if (root==NULL) return; else { PostOrder(root->lchild); PostOrder(root->rchild); cout<<root->data; } }