重建二叉树

问题描述

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

来源:牛客网
链接:https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

C++代码实现

使用递归的思想,因为前序遍历先访问根节点,由此找到相对应中序中的根,在中序中以根划分为左子树和右子树。由此递归。

class Solution {
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int vin_size = vin.size();
        if (vin_size == 0)
            return NULL;
        vector<int> pre_l, pre_r, vin_l, vin_r;
        // 创建根节点
        TreeNode *head = new TreeNode(pre[0]);
        // 中序中找到根节点的序号
        int k;
        for (int i = 0; i < vin_size; i++)
        {
            if (vin[i] == pre[0])
            {
                k = i;
                break;
            }
        }
        // 得出左子树前序序列
        for (int i = 1; i <= k; i++)
        {
            pre_l.push_back(pre[i]);
        }
        // 得出右子树前序序列
        for (int i = 0; i < k; i++)
        {
            vin_l.push_back(vin[i]);
        }
        // 得出左,右子树后序序列
        for (int i = k + 1; i < vin_size; i++)
        {
            pre_r.push_back(pre[i]);
            vin_r.push_back(vin[i]);
        }
        head->left = reConstructBinaryTree(pre_l, vin_l);
        head->right = reConstructBinaryTree(pre_r, vin_r);
        return head;
        
    }
};

python2代码实现

python2中使用的列表list,这里要懂得两个方法。
1、列表的index方法,str.index(str, beg=0, end=len(string)),str:指定检索的字符串,beg:开始索引,默认为0,end: 结束索引,默认为字符串的长度。如果包含子字符串返回开始的索引值,否则抛出异常。
2、切片,object[start_index:end_index:step],start_index:开始索引(包含此值),该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,end_index:结束索引(不包含此值),该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定;step:步长,正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。切片不会改变原列表。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if len(pre) == 0:
            return None
        head = TreeNode(pre[0])
        k = tin.index(pre[0])
        head.left = self.reConstructBinaryTree(pre[1:k+1],tin[0:k])
        head.right = self.reConstructBinaryTree(pre[k+1:],tin[k+1:])
        return head   

java代码实现

使用java的arrays,不要忘记导入栈模块。
Arrays.copyOfRange(T[ ] original,int from,int to), original:源数组,from:开始位置(取得到),to:结束位置(取不到)。复制。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.Arrays;
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if (pre.length == 0)
        {
            return null;
        }
        
        TreeNode head = new TreeNode(pre[0]);
        int k = 0;
        for (int i = 0; i < in.length; i++)
        {
            if (in[i] == pre[0])
            {
                k = i;
                break;
            }
        }
        head.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, k+1), Arrays.copyOfRange(in, 0, k));
        head.right = reConstructBinaryTree(Arrays.copyOfRange(pre, k+1, pre.length), Arrays.copyOfRange(in, k+1, in.length));
        return head;
    }
}
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读