根絕已知的遍歷順序(前序+中序||中序+後序)還原二叉樹詳解(轉)
最近做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】常用演算法(冒泡、插入、選擇、快速)和二叉樹詳解
常用演算法(冒泡、插入、選擇、快速)和二叉樹詳解 同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。 電腦科學中,演算法的時間複雜度是一個函式,它定量描述了該演算法的執行時間。這是一個關於
SBS(2)-- 平衡二叉樹判斷演算法(後續遍歷)
目錄 題目 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果二叉樹中任意節點的左右子樹的深度相差不超過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)求二叉樹
二叉樹的建立(先序)先序中序後序遍歷(遞迴演算法),求葉子結點個數,求樹的高度,樹中結點的個數,值為data的結點所在的層數
#include<iostream> #include<cstdio> #include<malloc.h> #define OVERFLOW -2 typedef struct BiTNode{ char data;
二叉樹的建立(先序輸入)與遍歷輸出模板
#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