1. 程式人生 > >根絕已知的遍歷順序(前序+中序||中序+後序)還原二叉樹詳解(轉)

根絕已知的遍歷順序(前序+中序||中序+後序)還原二叉樹詳解(轉)

最近做PAT遇到了還原二叉樹的問題,其實,這個演算法雖是基礎演算法,可是當真正比賽或者考試的時候不看模板還是不好寫的,因為遞迴的變數是要嚴格控制住的。

具體方法如下:

面試題目或多或少會出現這樣的選擇題或者簡答題:

首先我們得知道概念:

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

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

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

一、前序+中序

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 的右子樹類似可以推出。然後還原。

三、前序+後序

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

相關推薦

根絕順序+||+還原

最近做PAT遇到了還原二叉樹的問題,其實,這個演算法雖是基礎演算法,可是當真正比賽或者考試的時候不看模板還是不好寫的,因為遞迴的變數是要嚴格控制住的。 具體方法如下: 面試題目或多或少會出現這樣的選擇題或者簡答題: 首先我們得知道概念: 前序遍歷:先訪問當前節

【Java面試12】常用演算法冒泡、插入、選擇、快速

常用演算法(冒泡、插入、選擇、快速)和二叉樹詳解     同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。   電腦科學中,演算法的時間複雜度是一個函式,它定量描述了該演算法的執行時間。這是一個關於

SBS2-- 平衡判斷演算法後續

目錄 題目 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果二叉樹中任意節點的左右子樹的深度相差不超過1,那麼他就是平衡二叉樹。 遞迴版本解法 bool IsBalanced(BinaryTreeNode* pRoot

資料結構實驗之八:的深度SDUT 2804

#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char data ; struct node *l,*r; }; struct node *cr

資料結構實驗之四:還原 SDUT 3343

#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100],b[100]; int n; struct node

資料結構實驗之四:還原

Problem Description 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。 Input 輸入資料有多組,每組資料第一行輸入1個正整數N(1 <= N <=

C語言-資料結構與演算法還原

/*根據先序和中序遍歷輸出的字串還原二叉樹,然後輸出後序遍歷*/ #include<stdio.h> #include<stdlib.h> #define MAX 20 char preOrder[MAX] = "abdgcefh";//定義全域性變數,先序字串 char midOrd

線索實例創建,--2018.5.15

ID 中序遍歷 char turn 先序 AD 線索 lib data 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef enum 5 { 6 Link,

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

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

基本概念滿、完全,滿

1. 二叉樹 二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態:二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。 性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)。性質2:深度為k的二叉樹至多有2{k}-1個結點(k≥1)

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

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

根據還原

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

7-5 還原 25 分,根據 和 先

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

實驗三:的操作結構轉換,遞迴和非遞迴的先,以及層次,葉子結點和總結點的計數

(1)將一棵二叉樹的所有結點儲存在一維陣列中,虛結點用#表示,利用二叉樹性質5,建立二叉樹的二叉連結串列。 (2) 寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹

的建立輸入輸出模板

#include<iostream> using namespace std; typedef struct node { struct node *lchild; struct node *rchild; char dat

資料結構----求的深度

二叉樹為空:深度為0; 二叉樹為0:深度為1; 一般的二叉樹:深度=max{左子樹的深度,右子樹的深度} + 1。 int Depth (BiTree T) { if (!T)//如果二叉樹根節點為空,則深度為0 depthval=0; else {

劍指offer之求的深度非遞迴的層次Java實現

劍指offer上一道比較基礎的題目,但這個解法不僅可以求二叉樹的深度同時可以求二叉樹的最大層數,某一層的某一個節點 是一種比較通用的方法! 先建立資料模型 package Binary_tree; public class Node {//二叉樹節點 priva

如何根據還原

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

1建立二叉樹二叉連結串列。 2寫出對用二叉連結串列儲存的二叉樹進行先中序後序遍歷的遞迴和非遞迴演算法。 3寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 4二叉樹的所有葉子及結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu