原題描述(我的翻譯版):
圖1顯示了字母二叉樹的圖形表示。熟悉字母二叉樹概念的人可以跳過接下來的定義,切入正題。
字母二叉樹滿足下面兩條之一:
1. 它可以是空樹,
2. 它可以有乙個根節點,該節點以;乙個字母作為資料並且指向左子樹和右子樹。左子樹和右子樹也是字母二叉樹。
在字母二叉樹的圖形表示中:
1. 空樹完全省略
2. 每乙個節點都代表:
乙個字母,
左子樹不為空將該節點和左子樹相連,
右子樹不為空將該節點和右子樹相連,
葉子節點就是左右子樹為空的節點。圖1中的b, d, h, p和y為葉子節點。
問題:
在字母二叉查詢樹上考慮以下操作順序:
刪除葉子節點,並列出資料刪除,
重複這個過程直到樹為空,
從樹的左下方開始,我們產生樹的顯示序列,然後通過刪除資料的葉子節點使得樹為空。
節點刪除如下:
bdhpy
cm gq
k 給個圖:
你的問題是通過這些序列,輸出原樹的先序遍歷。
輸入:
輸入將包含乙個或多個資料集。每個資料集是一行或多行大寫字母的序列。
該行包含在上述階段中從二叉搜尋樹中移除的葉子節點。一行的字母將按字母順序排列。資料集是由一行只有乙個星號(「*」)分離。
最後乙個資料集後面是一行只包含乙個美元的符號($)。輸入中沒有空格或空行。
輸出:
對於每個輸入資料集,有乙個唯一的二叉搜尋樹對應產生的葉子節點的序列。輸出一行即那棵樹的先序遍歷,不能有空格。
輸入樣例:
bdhpy
cm gq
k *
ac b
$ 輸出樣例:
kgcbdhqmpy
bac
大意是讓我們對每乙個資料集建立乙個二叉樹,這個二叉樹是很特殊的,它是乙個二叉查詢樹(觀察左右子樹與根結點的關係,左子樹比其小,右子樹大),所以我們不難寫出**,這個題是一道二叉查詢樹的基礎例題。
**如下:
#include
#include
<
string
>
#include
<
queue
>
#include
using namespace std;
struct node*root;
void insert(node *&root,char x)
if(root->
data
==x) return;
else
if(x-
'a'data
-'a')
}}void fir(node *root)
}int main()
len=str.length();
for(i=len-
1;i>=
0;i--)//注意是倒序
insert(root,str[i]
); fir(root);
if(s=="$")
break;
root=null;//還原初始值來讀入下乙個
str.erase();
printf("\n");
} return 0;
}
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...