树形结构是一类重要的非线性数据结构,其中树和二叉树最为重要,那么如何创建二叉树.
方法1> 可采用树的先序遍历(根左右)的方式创建,从键盘输入树结构的先序遍历的value值即可.
假设1:我们规定如果键入“/”为空节点,此时树的节点结构val为char类型,此时创建的树结构的所有节点也是char类型.
假设2:我们规定如果键入"9"为空节点,此时树的节点结构val为int类型,此时创建的树结构的所有节点也是int类型
假设1为例进行编程:
typedef struct BiTNode{ char val; BiTNode *left; BiTNode *right; }; //先序遍历创建一个树结构 bool CreateBiTree(BiTNode * &T) { char ch; std::cout << "Input the value:"; std::cin >> ch; if(ch == '/') return true; BiTNode *p = new BiTNode(); if(!p) exit(OVERFLOW); p->val = ch; p->left = p->right = NULL; T = p; CreateBiTree(T->left); CreateBiTree(T->right); } //代码测试 //先序遍历打印结果 bool PreOrderTraverse(BiTNode *T,void (*visit)(char e)) { if(T == NULL){ std::cout << "/" ; return ture; } visit(T->val); PreOrderTraverse(T->right,visit); } void print(char e){ std::cout << e; }
main函数调用者可自己编写。
方法一中不难发现如果我们从键盘输入值,必须要设定输入什么value为空节点。也就是说如果我们要创建value是int的二叉树,必然从1到9其中有一个设为
空节点,可在上面代码中更改,创建的二叉树val有一个数值不能用,显然是不符合实际情况,但是如何解决这个问题呢,方法二给出了答案。
方法二>如果考虑要创建二叉树的val为int,double,float类型,则需要创建先序,中序,后序三者中的二个来确定唯一的二叉树.如果要创建这样一个二叉树:
假设1:从中序和后序遍历构造一个树,假设中序数组为vector<int> inorder = {9,3,15,20,7},后序数组为vector<int> postorder = {9,15,7,20,3}
假设1为例进行编程,由于面向对象编程很方便,我们打算用c++语言进行编程
struct TreeNode{ int val; TreeNode *left; TreeNode *right; } class SolutionA{ public: //从中序和后序遍历构造二叉树 TreeNode *buildTree(vector<int> &inorder,vector<int> &postorder) { return buildTree(inorder,0,inorder.size(),postorder,0,postorder.size()); } private: //具体实现 TreeNode *buildTree(vector<int> &inorder,int inorderL,int inorderR vector<int> &postorder,int postorderL,int postorderR) { //断言判断,vector为0执行 if(inorderL >= inorderR) { assert(postorderL >= postorderR); return NULL; } if(inorderL + 1 == inorderR){ assert(postorderL + 1 == postorderR); return new TreeNode(inorder[inorderL]); } TreeNode *root = new TreeNode(postorder[postorderR - 1]); // 1.找到根节点,在后序遍历中的最后一个 int rootPos = find(inorder.begin() + inorderL,inorder.begin() + inorderR,root->val) - inorder.begin(); assert(inorderL <= rootPos && rootPos < inorderR); int lsize = rootPos-inorderL; int rsize = rootPos-(rootPos+1); root->left = buildTree(inorder,inorderL,inorderL+lsize,postorder, postorderL,postorder+lsize); root->right = buildTree(inorder,rootPos+1,inorderR,postorder, postorderL+lsize,postorderR-1); return root; } };
main函数调用者可自己编写。这样就能创建一个唯一的二叉树了。
上面代码在本人的机器上编译通过,本人的开发环境是(win10 + vs2013 win32项目),如果测试失败,可能是敲入代码语法错误,并不是思路错误,可随时
私信本人进行更改。