数据结构——二叉树建树与遍历
来源:互联网 发布:windows开发是什么工作 编辑:程序博客网 时间:2024/04/28 04:01
从mooc上看到一张很好的图,说明了前序遍历,中序遍历,后序遍历之间的关系。
二叉树定义
template<class T>class BinTreeNode{public: T data; BinTreeNode<T> *lchild, *rchild; BinTreeNode():lchild(NULL),rchild(NULL) {} BinTreeNode(T x, BinTreeNode<T> *l = NULL, BinTreeNode<T> *r = NULL) :data(x), lchild(l),rchild(r) {}};
先序遍历
如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树,如上图×号。
//先序遍历 void PreOrderTree(BinTreeNode<T> *root) { if(root != NULL) { cout<<root->data<<" "; PreOrderTree(root->lchild); PreOrderTree(root->rchild); } }
中序遍历
如果二叉树不为空,中序遍历左子树,访问根节点,中序遍历右子树,如上图星号。
//中序遍历 void InOrderTree(BinTreeNode<T> *root) { if(root != NULL) { InOrderTree(root->lchild); cout<<root->data<<" "; InOrderTree(root->rchild); } }
后序遍历
如果二叉树不为空,后序遍历左子树,后序遍历右子树,访问根节点,如上图三角号。
//后序遍历 void PostOrderTree(BinTreeNode<T> *root) { if(root != NULL) { PostOrderTree(root->lchild); PostOrderTree(root->rchild); cout<<root->data<<" "; } }
层序遍历
void LevelOrderTree(BinTreeNode<T> *root) { queue<BinTreeNode<T> *> qu; qu.push(root); while(!qu.empty()) { root = qu.front(); cout<<root->data<<" "; if(root->lchild) qu.push(root->lchild); if(root->rchild) qu.push(root->rchild); qu.pop(); } cout<<endl; }
顺序建树
void CreatBinTree(BinTreeNode<T>* &root, T *dat,int di,int num) //顺序数组建树 { if(di>num) return; if(dat[di] != 0) { root = new BinTreeNode<T>(dat[di]); if(di*2 <= num) CreatBinTree(root->lchild, dat, di*2, num); if((di*2 +1) <= num) CreatBinTree(root->rchild, dat, di*2+1, num); } return; }
先序中序建树
void CreatBinTree(BinTreeNode<T>* &root, T *pre, T *in, int lenth) //先序中序建树 { if(lenth<=0) return; root = new BinTreeNode<T>(pre[0]); int i = 0; while(i<lenth) { if(pre[0]==in[i]) break; i++; } CreatBinTree(root->lchild, pre+1, in, i); CreatBinTree(root->rchild, pre+i+1, in+i+1, lenth-i-1); }
层序中序建树
void CreatBinTree(BinTreeNode<T>* &root, vector<T> in, vector<T> leve, int inl, int inr) //层序中序建树 { if(leve.size() == 0) return; root = new BinTreeNode<T>(leve[0]); int k; for(k=inl; k<inr; k++) { if(leve[0] == in[k]) break; } vector<int> lleve; vector<int> rleve; for(unsigned int i=1; i<leve.size(); i++) { bool isleft = false; for(int j=inl; j<k; j++) { if(leve[i] == in[j]) { isleft = true; break; } } if(isleft) lleve.push_back(leve[i]); else rleve.push_back(leve[i]); } CreatBinTree(root->lchild, in, lleve, inl, k-1); CreatBinTree(root->rchild, in, rleve, k+1, inr); }
0 0
- 数据结构——二叉树建树与遍历
- 数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)
- 二叉树——不建树遍历
- 数据结构六:二叉树的先序建树与中序的非递归遍历算法
- 数据结构,二叉树已知后续中序,建树,层次遍历;
- UVa 548 - Tree 二叉树的重建——中序遍历与后续遍历进行建树
- UVA 699(二叉树建树与遍历)
- 20170816(二叉树的建树与遍历 计算几何 信心)
- 用两个遍历建树——树的遍历、玩转二叉树
- 数据结构实验 建树+线索化二叉树+线索二叉树的遍历
- Tree——二叉树中序后序建树,先序遍历
- 数据结构与算法(17)——二叉树遍历
- 数据结构——二叉树的构建与遍历
- 二叉树——根据先序(后序)和中序遍历建树
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
- HDU 5444-二叉树的遍历+建树
- 数据结构——二叉树的遍历
- 数据结构——二叉树的遍历
- 1131: 最常用字符
- 毁灭你梦想的不是房价,而是你心里的小黑点
- POJ_2251 Dungeon Master
- strlen和sizeof区别
- C++智能指针 shared_ptr,unique_ptr和weak_ptr
- 数据结构——二叉树建树与遍历
- C语言解决“两个数的最大公约数和最小公倍数问题”
- 用两个队列实现一个栈
- android 利用代码实现圆角button(shape)
- Mycat高级进阶---Mycat注解
- 广义线性模型
- opencv入门学习之五:图像的对数变换
- 如何通过servlet编写程序能够统计浏览客户端页面的人数,ip不同人数加1
- win8.1或者win10使用最新版shadowsocks客户端出现SOCKS protocol error及此实现不是 Windows 平台 FIPS 验证的加密算法的一部分