17.二叉树的遍历

来源:互联网 发布:非平衡面板数据 编辑:程序博客网 时间:2024/06/01 19:51

二叉树的遍历有四种:

前序遍历:根节点->左子树->右子树

中序遍历:左子树->根节点->右子树

后序遍历:左子树->右子树->根节点

层序遍历:从左往右从上到下一层一层遍历

前三种的代码如下(递归与非递归实际上都需要用栈实现):

#include <iostream>#include <stack>using namespace std;typedef char datatype;typedef struct BinaryTreeNode{datatype value;BNode* lchild;BNode* rchild;}BNode;typedef BNode * BTree;void preorder(BTree t)//前序遍历的递归实现{if (t){cout << t->value;preorder(t->lchild);preorder(t->rchild);}}void inorder(BTree t)//中序遍历的递归实现{if (t){inorder(t->lchild);cout << t->value;inorder(t->rchild);}}void postorder(BTree t)//后序遍历的递归实现{if (t){postorder(t->lchild);postorder(t->rchild);cout << t->value;}}void Inorder(BTree t)//中序非递归实现{if (t == NULL)return;BTree p = t;stack<BTree> s;while (!s.empty() || p){while (p)//找到最左下节点{s.push(p);p = p->lchild;}if (!s.empty()){p = s.top();s.pop();cout << p->value;p = p->rchild;//出栈时需要遍历到右子树,关键!!!}}}void Preorder(BTree t)//前序非递归实现{if (t == NULL)return;BTree p = t;stack<BTree> s;while (!s.empty() || p){while (p){cout << p->value;s.push(p);p = p->lchild;}if (!s.empty()){p = s.top();s.pop();p = p->rchild;//出栈时需要遍历到右子树,关键!!!}}}void Postorder(BTree t)//后序非递归实现{if (t == NULL)return;stack<BTree> s;BTree p = t;BTree pLastVisit = NULL;while (p){s.push(p);p = p->lchild;//先找到最左下的节点}while (!s.empty()){p = s.top();s.pop();if (p->rchild == NULL || p->rchild == pLastVisit)//根节点被访问的前提是:无右子树或右子树已被访问过{cout << p->value;pLastVisit = p;//第一个访问的右节点一定没有右子节点,所以只需在这里标记已访问过}else{s.push(p);//根节点再次入栈,否则无法找到右子树p = p->rchild;while (p){s.push(p);p = p->lchild;}}}}

层序遍历需要用到队列,代码如下:

#include <iostream>#include <vector>using namespace std;typedef struct Node{Node *pleft;Node *pright;int data;}LNode,*BinTree;void levelOrder(BinTree root){if (root == NULL)return;vector <Node*> vec;      //这里使用数组可以完成队列功能vec.push_back(root);int cur = 0;//当前访问索引int last = 1;//队列长度while (cur < vec.size()){last = vec.size();while (cur < last)//当访问到最后一个节点时结束{cout << vec[cur]->data << " ";if (vec[cur]->pleft != NULL){vec.push_back(vec[cur]->pleft);}if (vec[cur]->pright != NULL){vec.push_back(vec[cur]->pright);}++cur;}cout << endl;}}