還原二叉樹(先序+中序-〉後序)
給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。
輸入格式:
輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串。
輸出格式:
輸出為一個整數,即該二叉樹的高度。
輸入樣例:
9
ABDFGHIEC
FDHGIBEAC
輸出樣例:
5
輸入:前序遍歷,中序遍歷
1、尋找樹的root,前序遍歷的第一節點G就是root。
2、觀察前序遍歷GDAFEMHZ,知道了G是root,剩下的節點必然在root的左或右子樹中的節點。
3、觀察中序遍歷ADEFGHMZ。其中root節點G左側的ADEF必然是root的左子樹中的節點,G右側的HMZ必然是root的右子樹中的節點,root不在中序遍歷的末尾或開始就說明根節點的兩顆子樹都不為空。
4、觀察左子樹ADEF,按照前序遍歷的順序來排序為DAFE,因此左子樹的根節點為D,並且A是左子樹的左子樹中的節點,EF是左子樹的右子樹中的節點。
5、同樣的道理,觀察右子樹節點HMZ,前序為MHZ,因此右子樹的根節點為M,左子節點H,右子節點Z。
觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了:
實現程式碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct Tree* BT;
struct Tree{
char data;
BT left;
BT right;
};
char in[55],pre[55];
BT findTree(char in[],char pre[],int length)
{
if(length==0) return NULL;
BT head = (BT)malloc(sizeof(struct Tree));
head -> data = pre[0];
int i=0;
for(i=0;i<length;i++)
{
if(in[i]==pre[0])break;
}
head ->left = findTree(in,pre+1,i);
head -> right=findTree(in+i+1,pre+i+1,length-i-1);
return head;
}
int length(BT head)
{
if(head==NULL)return 0;
int l=length(head->left);
int r=length(head->right);
return l>r?l+1:r+1;
}
int main()
{
int n;
scanf("%d",&n);
scanf("%s%s",pre,in);
BT head=(BT)malloc(sizeof(struct Tree));
head=findTree(in,pre,n);
printf("%d\n",length(head));
return 0;
}
原創:https://blog.csdn.net/islittlehappy/article/details/78501134
相關文章
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 已知二叉樹的先序和後序求任意一中序二叉樹
- 先序、中序、後序序列的二叉樹構造演算法二叉樹演算法
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 中序先序到後序 洛谷1827
- 二叉樹中序和後序遍歷表示式二叉樹
- 二叉樹 ---- 前序 中序 後序 知二求一二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 從中序與後序遍歷序列構造二叉樹二叉樹
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- 由中序序列和先序序列確定一顆二叉樹二叉樹
- 二叉樹--後序遍歷二叉樹
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- 二叉樹的前中後序遍歷二叉樹
- 資料結構實驗之二叉樹八:(中序後序)求二叉樹的深度資料結構二叉樹
- L2_006樹的遍歷(後序+中序->前序/層序)
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- The order of a Tree (二叉搜尋樹+先序遍歷)
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- 106. 從中序與後序遍歷序列構造二叉樹——Java實現二叉樹Java
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- 二叉樹先序迴圈,程式碼及詳解二叉樹
- 7-1 根據後序和中序遍歷輸出先序遍歷 (25 分)
- LeetCode 285 & 510. 二叉樹中序後繼 I & IILeetCode二叉樹