二叉查詢樹 POJ Falling Leaves

2021-07-27 03:36:28 字數 1851 閱讀 9920

原題描述(我的翻譯版):

圖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 ...