数据结构——二叉树建树与遍历
2017-03-22 20:08
351 查看
从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); }
相关文章推荐
- 数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)
- 数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)
- SDUT-2136数据结构实验之二叉树的建立与遍历
- linux学习总结(数据结构——树、二叉树以及遍历)
- 数据结构实验之 二叉树的建立与遍历
- 数据结构与算法6:二叉树的存储结构与遍历
- SDUT-2136 数据结构实验之二叉树的建立与遍历
- 数据结构之二叉树的建立与遍历
- 数据结构实验之求二叉树后序遍历和层次遍历【由前序序列和中序序列求后序序列,二叉树的层次遍历】
- 【数据结构】——构建二叉树,遍历二叉树
- 【数据结构与算法】二叉树的层序遍历
- sdut 2136 数据结构实验之二叉树的建立与遍历(二叉树遍历,叶子数和深度)
- SDUT 216 数据结构实验之二叉树的建立与遍历
- 数据结构——二叉树的遍历
- SDUT 2136 数据结构实验之二叉树的建立与遍历
- 数据结构作业:利用中序遍历和后序遍历构建二叉树(RMQ转LCA)
- 数据结构上机测试4.1:二叉树的遍历与应用
- 数据结构把顺序存储的二叉树转换成链式存储及前序,中序,后序遍历
- 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 数据结构实验之二叉树的建立与遍历