二叉樹重建

一、已知先序遍歷和中序遍歷。求后序遍歷。

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=944

依據先序遍歷和中序遍歷還原二叉樹的主要思想:

1、先序遍歷序列的第一個元素必然是根節點,能夠由此獲取二叉樹的根節點。

2、依據根節點,在中序遍歷序列中查找該節點。由中序遍歷的性質可知。中序遍歷中該根節點左邊的序列必然在根節點的左子樹中,而根節點右邊的序列必然在右子樹中。由此能夠知道先序遍歷中左子樹以及右子樹的起止位置。

3、分別對左子樹和右子樹反復上述的過程,直至全部的子樹的起止位置相等時。說明已經到達葉子節點,遍歷完成。

實現代碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
struct Node
{char value;Node *left, *right;
};
Node *build_new_node(char ch)
{Node *p = (Node*)malloc(sizeof(Node));p->value = ch;p->left = p->right = NULL;return p;
}
Node *Rebuild(char *pre, char *in, int n)
{if(n == 0) return NULL;char ch = pre[0];Node *p = build_new_node(ch);int i;for(i = 0; i < n && in[i] != ch; i++);int l_len = i;int r_len = n - i - 1;if(l_len > 0) p->left = Rebuild(pre+1, in, l_len);if(r_len > 0) p->right = Rebuild(pre+l_len+1, in+l_len+1, r_len);return p;
}
void PostOrder(Node *p)
{if(p == NULL) return ;PostOrder(p->left);PostOrder(p->right);printf("%c",p->value);
}
int main()
{char PreOrder[100], inOrder[100];while(~scanf("%s%s",PreOrder, inOrder)){Node *root = Rebuild(PreOrder,inOrder,strlen(PreOrder));PostOrder(root);printf("\n");}return 0;
}

二、已知中序遍歷和后序遍歷,求先序遍歷。

http://acm.nyist.net/JudgeOnline/problem.php?pid=756

依據中序遍歷和后序遍歷還原二叉樹的主要思想:

1、后序遍歷序列的最后一個元素必然是根節點,能夠由此獲取二叉樹的根節點。

2、依據根節點,在中序遍歷序列中查找該節點,由中序遍歷的性質可知,中序遍歷中該根節點左邊的序列必然在根節點的左子樹中,而根節點右邊的序列必然在右子樹中。

由此能夠知道后序遍歷中左子樹以及右子樹的起止位置。

3、分別對左子樹和右子樹反復上述的過程,直至全部的子樹的起止位置相等時,說明已經到達葉子節點。遍歷完成。

實現代碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
struct Node
{char value;Node *left, *right;
};
Node *build_new_node(char ch)
{Node *p = (Node*)malloc(sizeof(Node));p->value = ch;p->left = p->right = NULL;return p;
}
Node *Rebuild(char *post, char *in, int n)
{if(n == 0) return NULL;char ch = post[n-1];Node *p = build_new_node(ch);int i;for(i = 0; i < n && in[i] != ch; i++);int l_len = i;int r_len = n - i - 1;if(l_len > 0) p->left = Rebuild(post, in, l_len);if(r_len > 0) p->right = Rebuild(post + l_len, in+l_len+1, r_len);return p;
}
void PreOrder(Node *p)
{if(p == NULL) return ;printf("%c",p->value);PreOrder(p->left);PreOrder(p->right);
}
int main()
{char PostOrder[100], InOrder[100];while(~scanf("%s%s",PostOrder, InOrder)){Node *root = Rebuild(PostOrder,InOrder,strlen(PostOrder));PreOrder(root);printf("\n");}return 0;
}



轉載于:https://www.cnblogs.com/yxwkf/p/5058019.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

asyn4j -- java 異步方法調用框架

asyn4j 是一個java異步方法調用框架&#xff0c;基于消費者與生產者模式。包括了異步方法執行&#xff0c;異步回調執行&#xff0c;異步工作緩存模塊.支持Spring. 讓我們寫異步方法不再寫很多的相關多線程代碼。用asyn4j輕松搞定異步方法調用.提高程序的響應能力.轉載于:https…

Pytorch基礎(二)—— Transforms詳解

一、概念 Transforms是pytorch的圖像處理工具包&#xff0c;是torchvision模塊下的一個一個類的集合&#xff0c;可以對圖像或數據進行格式變換&#xff0c;裁剪&#xff0c;縮放&#xff0c;旋轉等&#xff0c;在進行深度學習項目時用途很廣泛。下面對Transforms內的常見類的…

圖像基本處理算法的簡單實現(二)

圖像基本處理算法的簡單實現&#xff08;一&#xff09; 圖像基本處理算法的簡單實現&#xff08;二&#xff09; 4&#xff09;膨脹腐蝕 屬于什么心態學&#xff0c;膨脹、腐蝕、擊中/擊不中變換、細化…&#xff08;又暈了T^T&#xff09;。簡單點好像就是集合運算&#xff0…

【WIN10】WIN2D——基本圖形的繪製

DEMO下載地址&#xff1a;http://yunpan.cn/c3iNuHFFAcr8h &#xff08;提取碼&#xff1a;8e48&#xff09; 先看一個截圖&#xff1a; 繪製了一些基本形狀。 DEMO的繪製代碼都非常簡單&#xff0c;不想在博客裡細說了&#xff0c;看代碼更為清晰些。 可能繪製扇形的代碼有些麻…

python socket 網絡編程

socket 套接字&#xff1a;網絡接口。 我們在網絡上需要傳輸自己需要的數據&#xff0c;我們在網絡上傳輸數據使用的是網絡協議&#xff0c; 而套接字就是我們將數據從本地采用協議傳輸的接口 socket模型&#xff1a; socket族&#xff1a; #AF_UNIX 被使用在類unix系統之間進行…

C# 并行運算方法簡析

一、概述 首先應該明白并行和并發的區別。 并發就是有多個幾乎同時到達的線程需要被處理&#xff0c;但只有有限個CPU&#xff0c;所以需要競爭上崗。 并行指有多個CPU資源同時處理多個線程&#xff0c;不存在競爭的概念&#xff0c;可以大量節省運行時間。 二、實現方法 C#…

強烈建議使用國外DNS解析域名,解決訪問速度和某些訪問故障!

域名解析的基本原理是把域名翻譯成IP地址&#xff0c;以便計算機能夠進一步通信&#xff0c;傳遞網址和內容等。  域名劫持就是在劫持的網絡范圍內攔截域名解析的請求&#xff0c;分析請求的域名&#xff0c;把審查范圍以外的請求放行&#xff0c;否則直接返回假的IP地址或者…

Windows 8 系統快捷鍵熱鍵列表收集

值得收藏參考的 Windows 8 系統快捷鍵熱鍵列表收集大全匯總&#xff0c;鍵盤黨效率黨必備啊&#xff01; 相信不少喜歡接觸新鮮軟件的同學都已經給電腦安裝上Windows 8 操作系統了吧&#xff01;這個系統優秀與否我們暫且不討論&#xff0c;作為一個鍵盤黨&#xff0c;學習了解…

格式化字符串使用

#codingutf-8 可以指定所需長度的字符串的對齊方式: < &#xff08;默認&#xff09;左對齊 > 右對齊 ^ 中間對齊 &#xff08;只用于數字&#xff09;在小數點后進行補齊 print 1:\t|{0:>10},.format(wangyu) print 2:\t|{0:4.2f}.format(1.1415926) print 3:\t|,…

Python中利用plt顯示中文標題解決方案

解決方法 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False plt.title(灰度級別頻率圖) plt.show()

Pytorch基礎(三)—— DataSet的應用

一、概念 Pytorch的標準數據集包括很多種類型&#xff0c;如CIFAR&#xff0c;COCO&#xff0c;KITTI&#xff0c;MNIST等&#xff0c;我們可以在官網查看。當然我們也可以做數據集&#xff0c;但需要自己標注。 二、如何調用數據集 一、調用torchvision 在程序中調用torch…

【圖像處理】——Python霍夫變換之直線檢測(主要是兩個函數HoughlinesHoughlinesP)

目錄 一、原理(摘自《數字圖像處理岡薩雷斯》) 2、Python函數 參數詳解 3、效果 4、實

實驗五實驗報告

實 驗 報 告 課程&#xff1a;信息安全系統設計基礎 班級&#xff1a; 1353 姓名&#xff1a;魏靜靜 劉虹辰 文藝 學號&#xff1a;20135302 20135325 20135331 成績&#xff1a; 指導教師&#xff1a;婁佳鵬 實驗日期&#xff1a…

Eclipse快捷鍵 10個最有用的快捷鍵

Eclipse中10個最有用的快捷鍵組合 一個Eclipse骨灰級開發者總結了他認為最有用但又不太為人所知的快捷鍵組合。通過這些組合可以更加容易的瀏覽源代碼&#xff0c;使得整體的開發效率和質量得到提升。 1. ctrlshiftr&#xff1a;打開資源 這可能是所有快捷鍵組合中最省時間的了…

iOS 檢查指定日期是否在當前日期之前

iOS檢查指定日期是否在當前日期之前, 直接上代碼: - (BOOL)checkProductDate: (NSString *)tempDate {NSDateFormatter *dateFormatter [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:"yyyy-MM-dd"];NSDate *date [dateFormatter dateFromString:t…

Pytorch基礎(四)—— 卷積層

一、概念 卷積從數學的角度講是一種矩陣的運算方法。我們可以用一個卷積核對一個矩陣進行卷積運算&#xff0c;具體運算過程圖示可以見pytorch官網。 卷積運算按輸入數據的通道數可分為單通道和多通道兩種。 單通道是指卷積核只有一個的情況。 多通道包括兩種。 分別是單個…

【圖像處理】——創建一個新的圖片

方法一:直接復制一個已經存在的圖片 img.copy() 如果是想生成一個指定大小的圖片,則可以通過numpy數組進行創建 方法二:通過numpy創建(注意有坑) img = numpy.zeros((h,w))#h,w是指定的圖像的高和寬,這樣看似可以其實不然上述方法得到的圖像不是8位的,但是圖像數組的…

BUAA 更大公約數

題目鏈接 給一個n*m的矩陣&#xff0c; 刪除里面的一行一列&#xff0c; 使得剩下的數的最大公約數最大。 一個格子&#xff08;x&#xff0c;y&#xff09;&#xff0c; 先預處理出&#xff08;1,1)到這個格子的內所有數的最大公約數&#xff0c; 同理處理出(1, m), (n, m), (…

How to make a Logical Volume ON AIX5.3

本文轉自 xkdcc 51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/brantc/116431&#xff0c;如需轉載請自行聯系原作者1. 確定要建立的卷大小&#xff0c;比如700M 2. 檢查要建立邏輯卷的卷組上的PP大小&#xff08;PP:物理分區&#xff0c;PP si…