1. 程式人生 > >如何根據前序、中序、後序遍歷還原二叉樹

如何根據前序、中序、後序遍歷還原二叉樹

首先我們得知道概念:

前序遍歷:先訪問當前節點,再訪問當前節點的左子樹,最後訪問當前節點的右子樹。對於二叉樹,深度遍歷與此同。規律:根在前;子樹在根後且左子樹比右子樹靠前,且第一個就是根節點;

中序遍歷:先訪問當前節點的左子樹,然後訪問當前節點,最後是當前節點的右子樹,二叉樹,中序遍歷會得到資料升序效果。規律:根在中;左子樹在跟左邊,右子樹在根右邊,左邊部分是根結點的左子樹的中序遍歷序列,右邊部分是根結點的右子樹的中序遍歷序列 ;

後序遍歷:先訪問當前節點的左子樹,然後是當前節點的又子樹,最後是當前節點。規律:根在後;子樹在根前且左子樹比右子樹靠前,且最後一個節點是根節點。

一、前序+中序

  1. 根據前序序列的第一個元素建立根結點;
  2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;
  3. 在前序序列中確定左右子樹的前序序列;
  4. 由左子樹的前序序列和中序序列建立左子樹;
  5. 由右子樹的前序序列和中序序列建立右子樹。
    如:已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh、dgbaechf,求二叉樹及後序遍歷序列。
    先序:abdgcefh—>a bdg cefh

中序:dgbaechf—->dgb a echf

得出結論:a是樹根,a有左子樹和右子樹,左子樹有bdg結點,右子樹有cefh結點。
先序:bdg—>b dg

中序:dgb —>dg b

得出結論:b是左子樹的根結點,b無右子樹,有左子樹。
先序:dg—->d g

中序:dg—–>dg

得出結論:d是b左子樹的根節點,d無左子樹,g是d的右子樹

然後對於a 的右子樹類似可以推出

最後還原: a

                                  b                                                 c

           d                                                       e                                f

                 g                                                                      h

後序遍歷:gdbehfca

二、後序+中序:

已知一棵二叉樹的後序序列和中序序列,構造該二叉樹的過程如下:
1. 根據後序序列的最後一個元素建立根結點;
2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;
3. 在後序序列中確定左右子樹的後序序列;
4. 由左子樹的後序序列和中序序列建立左子樹;
5. 由右子樹的後序序列和中序序列建立右子樹

如還是上面題目:如:已知一棵二叉樹的後序遍歷序列和中序遍歷序列分別是gdbehfca、dgbaechf,求二叉樹

後序:gdbehfca—->gdb ehfc a

中序:dgbaechf—–>dgb a echf
得出結論:a是樹根,a有左子樹和右子樹,左子樹有bdg結點,右子樹有cefh結點。
後序:gdb—->gd b

中序:dgb—–>dg b

得出結論:b是a左子樹的根節點,無右子樹,有左子樹dg。

後序:gd—->g d

中序:dg—–>d g

得出結論:d是b的左子樹根節點,g是d的右子樹。

然後對於a 的右子樹類似可以推出。然後還原。
三、前序+後序

前序和後序在本質上都是將父節點與子結點進行分離,但並沒有指明左子樹和右子樹的能力,因此得到這兩個序列只能明確父子關係,而不能確定一個二叉樹。 故此法無。不能唯一確定一個二叉樹。

相關推薦

根據還原

參考:https://blog.csdn.net/changjiale110/article/details/79489884 !首先我們得知道概念: 前序遍歷:先訪問當前節點,再訪問當前節點的左子樹,最後訪問當前節點的右子樹。對於二叉樹,深度遍歷與此同。規律:根在前;子樹在根後且左子樹比右子樹靠前,且第

如何根據還原

首先我們得知道概念: 前序遍歷:先訪問當前節點,再訪問當前節點的左子樹,最後訪問當前節點的右子樹。對於二叉樹,深度遍歷與此同。規律:根在前;子樹在根後且左子樹比右子樹靠前,且第一個就是根節點; 中序遍歷:先訪問當前節點的左子樹,然後訪問當前節點,最後是當

根據還原

最後一個元素 html 中序序列 .html tails art 一個 左右子樹 元素 遍歷方式的轉至二叉樹的四種遍歷方式 首先我們要知道三種遍歷方式的規律: 先序遍歷:跟在前,子樹的根在後,左子樹比右子樹考前,且第一個就是根節點。 中序遍歷:左子樹在根左邊,右子樹在根右

C語言根據和後續還原,並輸出的高度

7-23 還原二叉樹 (25 point(s)) 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。 輸入格式: 輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串

資料結構基礎 層次還原

【問題描述】 給出一個層次遍歷,和一箇中序遍歷的結果字串 層次  A B C D E F G 中序  D B A F E G C 其對應的二叉樹是:        A      /  /      B  C      /  /      D  E        / /  

和層還原

遞迴是將大問題分解成小問題求解,遞迴函式中輸入是層序遍歷和中序遍歷,層序遍歷的第一個值一定是根通過根和中序遍歷將樹分成左根右的情況,左子樹在層序遍歷中找到自己對應的層序遍歷進行下一次遞迴,右子樹同理#include "stdio.h" using namespace std

已知或者結構的演算法

二叉樹中的前序遍歷是先訪問根結點,再訪問左子樹,右子樹。 中序遍歷是先訪問左子樹,再是根結點,最後是右子樹。 後序遍歷是先訪問左子樹,再是右子樹,最後是根結點。 演算法思路是先根據前序遍歷的第一個結點或者後序遍歷的最後一個結點,查詢對應在中序遍歷中的位置,就可以確定左子樹包

的建立 (轉)

 // BTree.cpp : Defines the entry point for the console application./* 作者:成曉旭 時間:2001年7月2日(9:00:00-14:00:00) 內容:完成二叉樹的建立、前序遍歷、中序遍歷、後序遍歷 時間:2001年7月2日(14:0

根據重構

重構二叉樹目前主要是採取遞迴的方式 只能通過前序,中序 或者 後續,中序進行重構 前序和後序是不能夠重構的,因為在得知根節點後只有中序遍歷才能確定左子樹和右子樹的數目 二叉樹的幾種遍歷 前序遍歷:根結點 —> 左子樹 —> 右子樹 中序遍歷

刷題筆記4——根據重建

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

Leetcode 已知構建

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

根據重建

二叉樹的重建 二叉樹的重建方法: 一、根據前序加中序遍歷重建二叉樹 構造該二叉樹的過程如下: 1. 根據前序序列的第一個元素建立根結點; 2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;

劍指Offer-根據重建

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

根據構建的c語言完整程式碼

//重建二叉樹:輸入某二叉樹的前序和中序遍歷,重建出該二叉樹 #include<stdio.h> #include<malloc.h> typedef struct binarytreenode { int value; struct

根據構造(failed)

返回與給定的前序和後序遍歷匹配的任何二叉樹。  pre 和 post 遍歷中的值是不同的正整數。 示例: 輸入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7

七:重建(依據先(或者)和重建

off 相同 tree int roo 節點 先序 throw -a 對於一顆二叉樹。能夠依據先序遍歷(或者後序遍歷)和中序遍歷(樹中不含反復的數字)又一次還原出二叉樹。 解析: 1. 先序遍歷序列的第一個元素必然是根節點,能夠由此獲取二叉樹的根節點。 2. 依

構建

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

C語言由重構練習

1 由中根序列和後根序列重建二叉樹(10分) 題目內容: 我們知道如何按照三種深度優先次序來周遊一棵二叉樹,來得到中根序列、前根序列和後根序列。反過來,如果給定二叉樹的中根序列和後根序列,或者給定中根序列和前根序列,可以重建一二叉樹。本題輸入一棵二叉樹的中根序列和後根序列,要求在記憶體中

【資料結構】構造

根據一棵樹的前序遍歷與中序遍歷構造二叉樹 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNo

【資料結構】構造

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNod