description
輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。
input
包含多組測試資料。
每組測試資料第1行為樹的結點個數n(1≤n≤26)。
接下來包含n行,其中第i行(1≤i≤n)的資料依次為結點i的資料值ai(為乙個小寫字母),後面各元素為結點i的兒子序號,以0結束。若ai後僅含乙個0,則表示結點i為葉子節點。
output
輸出包含2行,第一行為先序遍歷序列,第二行為後序遍歷序列。
sample input
18r 2 3 4 0
a 5 6 0
b 7 0
c 8 9 10 0
w 0x 11 12 0
f 0s 13 14 0
t 0u 0
d 15 0
e 0i 16 17 18 0
j 0h 0
m 0o 0
n 0sample output
rawxdhebfcsimonjtu
hedxwfnomjiutscbar
————————————————————————————————————————————
●首先得理解題意啊!!
1.什麼是有序樹
有序樹即:每棵樹的子樹都按照從左到右的順序依次排列,不會出現沒有左側的子樹而有右側子樹的情況。
2.堂兄弟
即同一父親下的所有子樹
3.理解如何將有序樹轉換為二叉樹
解題思路:
●掌握基本的樹轉換為二叉樹的方法。
●找出根節點,構建普通樹。因為該題並沒有告訴根節點所在,所以首要目的是找出根節點,然後再構建普通樹。
●先將堂兄弟聯絡,便於之後轉換為二叉樹(其實rchild就是用來構建堂兄弟關係的鏈式結構,lchild用於儲存孩子)
●各種遍歷輸出。
有人曾問我為什麼會有這樣的轉化思路,其實上面有序樹的定義也就講過了,必定是先有左側的子樹,故這種方法必然保留了左側子樹與父親之間的連線。故對於每乙個結點,最多隻可能連有左側子樹和堂兄弟的兩條邊,如此便滿足了二叉樹定義。
ac**:
#include
using namespace std;
const
int maxn =30;
int n;
//孩子兄弟表示樹
typedef
struct tnodetree;
tree tree[maxn]
;void
preorder
( tree t,
int tmp)
//前序遍歷
void
postorder
( tree t,
int tmp)
//中序遍歷
intmain()
}int tmp =0;
for(
int i =
1; i <= n; i++)}
tree[tmp]
.rchild =0;
//根節點沒有兄弟
preorder
(tree,tmp)
;cout<
postorder
(tree,tmp)
;cout<
}return0;
}
樹轉換為二叉樹
輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。包含多組測試資料。每組測試資料第1行為樹的結點個數n 1 n 26 接下來包含n行,其中第i行 1 n n 的資料依次為結點i的資料值ai 為乙個小寫字母 後面各元素為結點i的兒子序列,以0結束。若ai後僅含乙個...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...