面试题6-重建二叉树
基础知识
树是在编程中经常遇到的一种数据结构,它的逻辑结构很简单:除根节点外每个结点都有父节点,除叶子结点外每个结点都有一个或者多个子结点,父节点和子结点通过指针相连。在学习树的结构的时候,多是二叉树,也就是每个结点最多只能有两个子结点。在二叉树中最重要的莫过于遍历。在树的遍历方法中共有先序、中序、后续遍历三种遍历方式,每一种遍历都有递归和循环两种不同的实现方法。同时在树的应用中,又能考察到广度优先搜索、深度优先搜索这两种编程思想,同时二叉搜索树和红黑树、堆都是树的应用。这么说起来觉得树这种结构还是很重要的.
题目
输入某二叉树的先序遍历和中序遍历,请重建出该二叉树。
解题思路及代码
- 先求出根节点(前序序列第一个元素)。
- 将根节点带入到中序遍历序列中求出左右子树的中序遍历序列。
- 通过左右子树的中序序列元素集合位置,带入前序遍历序列可以求出左右子树的前序序列。
- 左右子树的前序序列第一个元素分别是根节点的左右儿子
- 求出了左右子树的4种序列可以递归上述步骤
- /**
- * Definition for binary tree
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode(int x) { val = x; }
- * }
- */
- public class Solution {
- public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
- int len1 = pre.length, len2 = in.length;
-
- if(len1 != len2 || len1 <= 0)
- return null;
- TreeNode res = getTreeNode(pre, in, 0, len1-1, 0, len2-1);
- return res;
-
- }
- public TreeNode getTreeNode(int[] pre, int[] in, int preStart, int preEnd, int inStart, int inEnd){
- if( preStart > preEnd || inStart > inEnd)
- return null;
- int val = pre[preStart];//求出根节点
- int pos = -1;
- for(int i = inStart; i<= inEnd; i++){//在中序遍历中查找根节点
- if(val == in[i]){
- pos = i;
- break;
- }
- }
- if(pos == -1)
- return null;
- TreeNode node = new TreeNode(val);
- //根据中序遍历的根节点位置,重新计算左右子树的先序和中序遍历的序列,重构二叉树。
- node.left = getTreeNode(pre, in, preStart+1, preStart + pos - inStart, inStart, pos-1);
- node.right = getTreeNode(pre, in, preStart + pos - inStart + 1, preEnd, pos+1, inEnd);
- return node;
- }
- }