1. 程式人生 > >輸入某二叉樹的前序遍歷和中序遍歷的結果,重建此二叉樹。

輸入某二叉樹的前序遍歷和中序遍歷的結果,重建此二叉樹。

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
這裡寫圖片描述

比如我們知道一二叉樹的前序遍歷和中序遍歷,要求畫出這棵樹。
前序遍歷為1,2,4,7,3,5,6,8
中序遍歷為4,7,2,1,5,3,8,6
這裡寫圖片描述
可以初步確定樹的結構如下:
這裡寫圖片描述
生成樹的具體過程如下:
這裡寫圖片描述

如果理解了遞迴的訪問,那麼建樹的過程就容易多了,前序遍歷序列的第一個數(後序遍歷的最後一個數)一定是根結點,所以可以根據此結點在中序序列中的位置把中序序列分為左子樹和右子數兩個部分,同樣的道理,在左子樹和右子數中同樣可以用到這樣的規律來確定每個中間結點。

# -*- 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
if len(pre) == 1: return TreeNode(pre[0]) else: flag = TreeNode(pre[0]) flag.left = self.reConstructBinaryTree(pre[1:tin.index(pre[0])+1],tin[:tin.index(pre[0])]) flag.right = self.reConstructBinaryTree(pre[tin.index(pre[0])+1:],tin[tin.index(pre[0
])+1:] ) return flag

相關推薦

輸入結果重建

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 比如我們知道一二叉

輸入結果重建出該(java實現並測試)

假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 package ssp; class TreeNode { int val; TreeNod

輸入結果重建出該假設輸入結果都不含重複的數字例如輸入序列{1,2,4,7,3,5,6,8}序列{4,7,2,1,5

思路:前序遍歷的第一個元素就是根節點,在中序遍歷中找到根節點的位置,根節點前面的元素就二叉樹的左子樹,根節點後面的元素就是二叉樹中的右子樹,在找出左子樹和右子樹的前序遍歷和中序遍歷,然後遞迴呼叫,再找根節點和左子樹、右子樹  /** * Definition for bi

輸入結果重建

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。   思路:          先序遍歷的第一個元素為根節點,在中序遍歷中找到這個根節點,從而可以將中序遍歷分為左右兩個部分,左邊部分為左子樹的中序遍歷,右

構造

fin traversal dtree 構造二叉樹 div integer break param val 根據前序遍歷和中序遍歷樹構造二叉樹 樣例: 給出中序遍歷:[1,2,3]和前序遍歷:[2,1,3]. 返回如下的樹: 2 / \ 1 3 我們知道前序遍歷

構建

[] for 中序 break pan n) turn star 前序遍歷 public Node reConstructBinaryTree(int[] pre,int[] in){ if(pre==null || in ==null){

(拼多多筆試演算法)根據確定後的兩種思路

根據二叉樹的前序遍歷和中序遍歷確定後序遍歷 輸入:第一行:結點數目 第二行:前序遍歷陣列 第三行:中序遍歷陣列 輸出 :後序遍歷陣列 例如:第一行:7 第二行:6 4 2 5 3 1 7 第三行:4 2 5 6 1 3 7 輸出 :5 2 4 1 7 3 6 我思

刷題筆記4——根據重建

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 分析 在前序遍歷中,第一個數字總

唯一確定一顆

---恢復內容開始--- 問題描述 如果給出了遍歷二叉樹的前序序列和中序序列,則可以構造出唯一的一顆二叉樹。 基本要求 已知一棵二叉樹的前序序列和中序序列,試設計完成下列任務的一個演算法: (1).構造一顆二叉樹 (2).證明構造正確(即分撥兒以前序和中序遍歷該樹,將得到的結果 與給出的序列進行

C++ 重構(劍指offer)

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 這道題之前做過幾次,以前

學習筆記之使用構造

總結一下學習筆記: 一、提出問題 給出一棵樹的前序遍歷和中序遍歷,構造二叉樹,你可以假設這棵樹中不存在重複的數。 例如:給出前序和中序遍歷序列:preorder = [3,9,20,15,7],inorder=[9,3,15,20,7] 得到如下所示的二叉樹:

Leetcode 已知(後構建

我們知道,中序遍歷是左子樹->根節點->右子樹。因此我們可以通過中序遍歷可以確定左右子樹的元素個數。 而通過前序(後序)遍歷,我們可以確定根節點的位置,然後通過尋找根節點在中序遍歷的位置,可以確定左右子樹。 然後遞迴遞迴左右子樹實現構建二叉樹。 前序和中序:

已知如何得到它的後

對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下: 前序遍歷    N->L->R中序遍歷    L->

根據序列求解後的演算法

問題模型:已知某二叉樹前序遍歷序列為1,2,3,4,5,6,中序遍歷為3,2,4,1,6,5,設計程式計算後序序列。 關於這個問題你可以通過前序遍歷和中序遍歷建立一顆樹,然後通過後序遍歷進行求解,當然還可以直接根據已知兩序列直接推理後序序列,本文將對這種分析進行介紹。 利用

計算機技術——已知如何得到它的後

對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下:前序遍歷    N->L->R中序遍歷    L->N-&

【面試題】根據構造

class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { int len = vin.si

重建序列:1 2 3 4 5 6

由前序遍歷和中序遍歷重建二叉樹 前序序列(根-左-右):1 2 3 4 5 6 中序序列(左-根-右):3 2 4 1 6 5 1、由前序遍歷可知根節點為第一個元素1,在中序遍歷序列中找到1對

給定一棵,求其後

#include <stdio.h> #include <string.h> struct Node{ Node *lChild; Node *rChild; char c; }Tree[50]; //靜態記憶體分配陣

已知

後續遍歷的順序是左右根,中序遍歷的順序是左根右  這點應該懂吧  由後續訪問序列可以看出最後一個被訪問的必定是這個樹的根  而中序遍歷的序列可以看出,一棵樹當根確定後,在根前面被訪問的是他的左子樹,後邊的是他的右子樹元素  弄懂了上邊兩點就開始做題吧  由後序遍歷序列是DBCEFGHA  為了方便,我寫小寫字

(14)----由重建遞迴方式

相關連結: 1、二叉樹定義 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeN