二叉树的重建
几乎所有的人都知道二叉树可以根据前序遍历+中序遍历或者后序遍历+中序遍历的方式重新建立原来的二叉树,并且结果是唯一的。下面就来看一下相关的方法。
前序+中序重建二叉树
给定一棵二叉树的前序和中序遍历序列,重新建立这棵二叉树。
注意:在前序中确定了根节点以后,要去中序里面查找这个根节点,这时的查找没必要从数组的0下面开始,从这个树的中序的第一个点开始。然后查找的个数为停止的下表减去中序开始的下表。
这里重建二叉树用的是递归的方法,要注意递归的出口。不然会死循环。
所以代码实现:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { int preStart = 0; int preLast = preorder.size() - 1; int inStart = 0; int inLast = inorder.size() - 1; return SubTreeBuild(preorder, preStart, preLast, inorder, inStart, inLast); } TreeNode* SubTreeBuild(vector<int>& preorder, int preStart, int preLast, vector<int>& inorder, int inStart, int inLast) { if(preStart > preLast || inStart > inLast) return NULL; TreeNode *root = new TreeNode(preorder[preStart]); //search the root in the inorder int i = inStart; while(inorder[i] != preorder[preStart]) { ++i; } root->left = SubTreeBuild(preorder, preStart + 1, preStart + i - inStart, inorder, inStart, i - 1); root->right = SubTreeBuild(preorder, preStart + 1 + i - inStart, preLast, inorder, i + 1, inLast); return root; }//SubTreeBuild
后序+中序重建二叉树
其实递归的方式并不是难点,重要的是定边界值。
TreeNode* SubTreeBuild(vector<int>& inorder, int ileft, int iright, vector<int>& postorder, int pleft, int pright) { if(ileft > iright || pleft > pright) return NULL; TreeNode *root = new TreeNode(postorder[pright]); //search the root node in the inorder int i = ileft; while(inorder[i] != postorder[pright]) { ++i; } root->left = SubTreeBuild(inorder, ileft, i - 1, postorder, pleft, pleft + i - ileft - 1); root->right = SubTreeBuild(inorder, i + 1, iright, postorder, pleft + i - ileft, pright - 1); return root; }
二叉树的序列化和反序列化
时间: 2024-11-05 17:14:35