关闭

重建二叉树

标签: 二叉树
118人阅读 评论(0) 收藏 举报
分类:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。


C++

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

//输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
//假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
//例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

class Solution {
public:
    struct TreeNode* reConstructBinaryTree(std::vector<int> pre,std::vector<int> in) {

             //首先判断序列是否为空,如果为空,则表示当前为空树,返回空
     if (in.size() == 0 || pre.size() == 0)
     {
         return NULL;
     }

     //提取前序遍历中的根节点,构建根节点
     struct TreeNode *root=new TreeNode(pre[0]);

     //从前序和中序序列表中,提取该节点前后的序列
     //构建该根节点的左右子树节点,首先查找该根节点的在中序遍历位置
     int i = 0;
     //如果不为空,则根据以下规则进行判断。首先查看前序遍历,第一个节点肯定为根节点,root节点,此时根据节点的关键字查看中序遍历列表中的位置,如果全部在左边,则表示该树
     //只有左子树,全部在右边,表示该树只有右子树,两边都有,说明左右子树都存在
     while (in[i] != pre[0])
     {
         i++;
     }

     //根据当前节点的位置,将节点分成两部分,将前序和中序遍历的列表分为两部分,一部分是是左子树的,一部分是右子树的,分别作为参数进行递归
     std::vector<int> preLeftList;
     std::vector<int> preRightList;
     std::vector<int> inLeftList;
     std::vector<int> inRightList;

     //提取左子树
     for (int j = 0; j < i; j++)
     {
         preLeftList.push_back(pre[j+1]);
         inLeftList.push_back(in[j]);
     }

     //提取右子树
     for (int j = i+1; j < in.size(); j++)
     {
         preRightList.push_back(pre[j]);
         inRightList.push_back(in[j]);
     }

     root->left = reConstructBinaryTree(preLeftList, inLeftList);
     root->right = reConstructBinaryTree(preRightList, inRightList);

     return root;        
    }
};

Java

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
   public static TreeNode reConstructBinaryTree(int[] pre, int[] in)
    {
        if(pre == null || in == null || pre.length == 0 || in.length == 0)
            return null;
        TreeNode root = reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length-1);
        return root;
    }

    private static TreeNode reConstructBinaryTree(int[] pre,int startPre, int endPre,int[] in, int startIn, int endIn)
    {
        if(startPre > endPre || startIn > endIn)
            return null;

        TreeNode root = new TreeNode(pre[startPre]);

        //search for root node in in[]
        int rootIn = 0;
        for(; rootIn < in.length; rootIn++)
        {
            if(in[rootIn] == root.val)
                break;
        }
        int leftlength = rootIn - startIn;
        int rightlength = endIn - rootIn;
        if(leftlength > 0)
            root.left = reConstructBinaryTree(pre, startPre+1, startPre+leftlength, in, startIn, rootIn-1);
        if(rightlength > 0)
            root.right = reConstructBinaryTree(pre, startPre+leftlength+1, endPre, in, rootIn+1, endIn);


        return root;
    }

}

Python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, preorder, inorder):
        # write code here
        if not preorder or not inorder:
            return
        root = TreeNode(preorder[0])
        i = inorder.index(preorder[0])
        root.left = self.reConstructBinaryTree(preorder[1:i+1], inorder[:i])
        root.right = self.reConstructBinaryTree(preorder[i+1:], inorder[i+1:])
        return root
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:63246次
    • 积分:1827
    • 等级:
    • 排名:千里之外
    • 原创:123篇
    • 转载:6篇
    • 译文:0篇
    • 评论:4条
    最新评论