重建二叉树

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

C#实现:

public class BinaryTreeNode
    {
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;

        public static BinaryTreeNode Construct(ArrayList preorder, ArrayList inOrder)
        {
            if (preorder == null || inOrder == null || preorder.Count != inOrder.Count
                || preorder.Count <=0 || inOrder.Count <=0)
                return null;
            return ConstructCore(preorder, inOrder);
        }

        public static BinaryTreeNode ConstructCore(ArrayList preorder, ArrayList inOrder)
        {
            int rootValue = (int)preorder[0];

            BinaryTreeNode root = new BinaryTreeNode();
            root.value = rootValue;

            int pos = inOrder.IndexOf(rootValue);
            if (pos > 0) // 根值的左边还有元素
            {
                root.left = ConstructCore(preorder.GetRange(1, pos), inOrder.GetRange(0, pos));
            }
            if (pos < inOrder.Count - 1) // 根值的右边还有元素
            {
                root.right = ConstructCore(preorder.GetRange(pos + 1, preorder.Count - pos - 1),
                    inOrder.GetRange(pos + 1, inOrder.Count - pos - 1));
            }
            return root;
        }
        }

Java实现:

public class BinaryTreeNode {
	int value;
	BinaryTreeNode left;
	BinaryTreeNode right;

	// 输入某二叉树的前序遍历黑夜中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历
	// 中都不包含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历
	// {4, 7, 2, 1, 5, 3, 8, 6},则重建出该二叉树
	public static BinaryTreeNode Construct(List<Integer> preOrder, List<Integer> inOrder) {
		if (preOrder == null || inOrder == null || preOrder.size() != inOrder.size() || preOrder.size() <= 0
				|| inOrder.size() <= 0)
			return null;
		return ConstructCore(preOrder, inOrder);
	}

	public static BinaryTreeNode ConstructCore(List<Integer> preOrder, List<Integer> inOrder) {
		int rootValue = preOrder.get(0);

		BinaryTreeNode root = new BinaryTreeNode();
		root.value = rootValue;

		int pos = inOrder.indexOf(rootValue);
		if (pos > 0) // 根值的左边还有元素
		{
			root.left = ConstructCore(preOrder.subList(1, pos+1),
					inOrder.subList(0, pos));
		}
		if (pos < inOrder.size() - 1) // 根值的右边还有元素
		{
			root.right = ConstructCore(preOrder.subList(pos + 1, preOrder.size()),
					inOrder.subList(pos + 1, inOrder.size()));
		}
		return root;
	}
	}

Python实现:

class BinaryTree(object):
    def __init__(self, value=None, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def rebuild(self, preOrder, inOrder):
        if preOrder == None or inOrder == None or len(preOrder) <=0 or len(inOrder) <=0                 or len(preOrder) != len(inOrder):
            return None
        cur = BinaryTree(preOrder[0])
        index = inOrder.index(preOrder[0])
        cur.left = self.rebuild(preOrder[1: index+1], inOrder[:index])
        cur.right = self.rebuild(preOrder[index+1:], inOrder[index+1:])
        return cur
时间: 2024-10-10 01:19:43

重建二叉树的相关文章

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(

【编程之美】java实现重建二叉树

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

根据前序和中序重建二叉树

注意:1.仅根据前序和后序无法构建唯一的二叉树:2.二叉树前序遍历,第一个数字总是树的根节点的值:3.中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值的左边,右字树的值在根节点的值的右边:4.思路:递归 #include <iostream> #include <stdlib.h> using namespace std; struct Node{ int value; Node* left; Node* right; }; Node* ConstructCore(in

剑指offer 重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回 思路:首先找到root,然后递归的重建root -> left,root -> right. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNod

重建二叉树与二叉树的层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000).代表有t组測试数据.每组包含两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 演示样例输

《剑指offer》— JavaScript(4)重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 实现代码 function reConstructBinaryTree(pre, vin) { if(!pre || pre.length===0){ return; } var root={ val:pre[0] }; for(var i

牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端

   总结:    重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可 [编程题]重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 完整通过代码: 先新建一个二叉树的类 public class TreeNode { int val; TreeNode left

【剑指offer】重建二叉树

题目:重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含童复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点. 二叉树结点的定义如下: struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; 创建根节点.前

[leetcode]重建二叉树(先序和终须) 中序遍和后续

分割后长度相等,就是参数麻烦,p,先序的起始点, ib,ie 终须的结束和开始. 1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public TreeNode bu