二叉树的创建以及遍历方法
来源:互联网 发布:美丽中国网络知识竞赛 编辑:程序博客网 时间:2024/05/22 03:46
在此分别总结先序,中序,后序的结点输出顺序。
先序: 1.访问根结点
2.访问左子树
3.访问右子树
先序较简单,不予以即系解释。
中序:1.访问左子树
2.访问根结点
3.访问右子树
原则:访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树。】直到访问到叶子结点后输出。
输出根。
访问右子树。【先访问右子树中的左子树,再访问右子树中的右子树。】直到访问到叶子结点后输出。
具体步骤如下:
A作为根。从A开始,先访问A的左子树。即。
在看B的左子树,D。则输出D。B无左子树。访问完B的左子树。然后访问B。输出B。再看B的右子树。F有左子树E,则输出E。返回输出F。A的左子树全部输出完,再返回A,输出A。
同理,看A的右子树。。输出顺序为G,H,C,I。
所以,中序遍历输出的结果为:(D B E F)A(G H C I).
后序:1.访问左子树
2.访问右子树
3.访问根
原则:访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树】。直到访问到叶子结点后输出。
访问右子树。【先访问右子树中的左子树,再访问右子树中的右子树】。直到访问到叶子结点后输出。
再返回访问根,并输出。
具体步骤:
先访问A的左子树。再访问左子树中的左子树。【即:A的左子树为B,再访问B的左子树D。D没有左右子树,输出D。】,然后访问左子树中的右子树。【即:访问B的右子树F,F还有左子树,再访问F的左子树E,E没有左右子树。输出E。再输出F,再输出B。】。
然后访问A的右子树。再访问右子树中的左子树。【即:A的右子树为C,再访问C的左子树G。G还有右子树H,输出H。再输出G,再输出G】,然后访问右子树中的右子树。【即:访问C的右子树I,I没有左右子树,输出I。在输出C。再输出A。】。
所以,后序遍历输出结果为:(D E F B)(H G I C)A
代码如下:
#include<iostream>#include<stack>using namespace std;// 定义树结构体typedef struct _BiTree{char data; // 数据域struct _BiTree *Lchild; // 左孩子结点指针struct _BiTree *Rchlid; // 右孩子指针}BiNode,*BiTree;// 递归先序遍历二叉树void PreOrder(BiTree root){if (NULL!=root){cout << root->data<<" ";PreOrder(root->Lchild);PreOrder(root->Rchlid);}}// 递归中序遍历二叉树void InOrder(BiTree root){if (NULL != root){InOrder(root->Lchild);cout << root->data << " ";InOrder(root->Rchlid);}}// 递归后序遍历二叉树void PostOrder(BiTree root){if (NULL!=root){PostOrder(root->Lchild);PostOrder(root->Rchlid);cout << root->data<<" ";}}// 创建二叉树void CreateBiTree(BiTree *root){char ch;cin >> ch;if (ch=='.'){*root = NULL;}else{*root = new BiNode;if (NULL==*root){cout << "动态申请内存失败!" << endl;return;}(*root)->data = ch;CreateBiTree(&((*root)->Lchild));CreateBiTree(&((*root)->Rchlid));}}// 后序遍历求二叉树高度的递归算法int PostTreeDepth(BiTree root){int hl = 0; // 求左子树的高度int hr = 0; // 求右子树的高度int max = 0; // 记录左右子树中最大的树的高度if (root == NULL){return 0;}else {hl = PostTreeDepth(root->Lchild);hr = PostTreeDepth(root->Rchlid);max = hl > hr ? hl : hr;return max + 1;}}// 非递归先序遍历二叉树void PreOrder1(BiTree root){stack<BiNode*>s; // 创建栈BiTree p = root;//BiTree q = NULL;while (p!=NULL||!s.empty()){if (p!=NULL){cout << p ->data << " ";s.push(p);p = p->Lchild;}else{p = s.top(); // 记录当前栈顶元素s.pop(); // 栈顶元素出栈p = p->Rchlid;}}}// 非递归中序遍历二叉树void InOrder1(BiTree root){stack<BiNode*>s;BiNode *p = root;//BiNode *q = NULL;while (p != NULL | !s.empty()){if (NULL != p){s.push(p);p = p->Lchild;}else{p = s.top();s.pop();cout << p->data << " ";p = p->Rchlid;}}}// 非递归后序遍历二叉树void PostOrder1(BiTree root){stack<BiNode*>s;BiNode *p = root;BiNode *q = NULL;while (p!=NULL||!s.empty()){while (p!=NULL){s.push(p);p = p->Lchild;}if (!s.empty()){p = s.top();if (p->Rchlid == NULL || p->Rchlid == q){cout << p->data << " ";s.pop();q = p;p = NULL;}else{p = p->Rchlid;}}}}int main(void){BiTree btree = NULL;CreateBiTree(&btree);PreOrder(btree);cout << endl;InOrder(btree);cout << endl;PostOrder(btree);cout << endl;//int n = PostTreeDepth(btree);//cout << n << endl;PreOrder1(btree);cout << endl;InOrder1(btree);cout << endl;PostOrder1(btree);cout << endl;// AB.DF..G..C.E.H..return 0;}
结果如下:
- 二叉树的创建以及遍历方法
- 二叉树的创建以及遍历
- C++ 二叉树的创建以及遍历
- 二叉树的创建以及遍历
- 二叉树的存储、创建以及遍历
- 二叉树的创建以及各种遍历
- 二叉树的创建以及二叉树的4种遍历方法
- 二叉树(一):二叉树的创建以及三种遍历方法的递归实现
- 二叉树创建以及遍历
- 二叉树的创建,递归遍历以及非递归遍历
- 创建二叉树的两种方法以及三种遍历方法
- java创建二叉树以及8种遍历方法
- 二叉树的创建,以及递归前中后序以及层次遍历
- 【转】线索二叉树的原理以及创建和遍历
- java实现二叉树的创建以及遍历
- java实现二叉树的创建以及遍历
- 二叉数组的创建以及后续遍历
- 二叉树创建以及遍历方式
- Android 多媒体(音乐播放器)
- Dubbo 原理解析-Dubbo 内核实现之 SPI 简单介绍
- 比特币这次分不了?重头戏在11月?
- WIN10下安装USB转串口驱动 出现“文件的哈希值不在指定的目录”
- 二维数组中的查找
- 二叉树的创建以及遍历方法
- Spring 使用小记
- 将字符串数组中的空格转化成20%(例如:把“we are happy.”转化为“we20%are20%happy.”)
- 解决dubbo xsd 报错问题: dubbo cvc-complex-type.2.4.c
- AVL---平衡二叉树的基本操作
- 列表(1)-《数据结构与算法》
- hrm项目实战
- cc2541工程代码,main函数初始化讲解
- 常见的排序算法与MSQL