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;}}
阅读全文
0 0
- 17.二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- android 开机广播接收不到的原因
- 4.1.1ReentrantLock实现同步,测试1
- 技术点-MD5密码加密-32/16 位
- 屏幕适配之c3媒体查询代码块(20/1为1rem)
- tar : 文件归档命令 (本身不做任何压缩)
- 17.二叉树的遍历
- 关于Android启动页全屏的解决方案
- Error mounting /dev/sda7 at 解决方法
- 【C++11新特性】 C++11智能指针之weak_ptr
- python 的日志logging模块学习
- 使用HDP搭建并管理集群
- 讨论构造拷贝构造的N种调用情况问题
- C利用宏实现函数重载
- 元数据管理