原題描述(我的翻譯版):
圖1顯示了字母二叉樹的圖形表示。熟悉字母二叉樹概念的人可以跳過接下來的定義,切入正題。 字母二叉樹滿足下面兩條之一: 1. 它可以是空樹, 2. 它可以有一個根節點,該節點以;一個字母作為數據并且指向左子樹和右子樹。左子樹和右子樹也是字母二叉樹。 在字母二叉樹的圖形表示中: 1. 空樹完全省略 2. 每一個節點都代表: 一個字母, 左子樹不為空將該節點和左子樹相連, 右子樹不為空將該節點和右子樹相連, 葉子節點就是左右子樹為空的節點。圖1中的B, D, H, P和Y為葉子節點。 問題: 在字母二叉查找樹上考慮以下操作順序: 刪除葉子節點,并列出數據刪除, 重復這個過程直到樹為空, 從樹的左下方開始,我們產生樹的顯示序列,然后通過刪除數據的葉子節點使得樹為空。
節點刪除如下: BDHPY CM GQ K 給個圖:
你的問題是通過這些序列,輸出原樹的先序遍歷。 輸入: 輸入將包含一個或多個數據集。每個數據集是一行或多行大寫字母的序列。 該行包含在上述階段中從二叉搜索樹中移除的葉子節點。一行的字母將按字母順序排列。數據集是由一行只有一個星號(“*”)分離。 最后一個數據集后面是一行只包含一個美元的符號($)。輸入中沒有空格或空行。 輸出: 對于每個輸入數據集,有一個唯一的二叉搜索樹對應產生的葉子節點的序列。輸出一行即那棵樹的先序遍歷,不能有空格。 輸入樣例: BDHPY CM GQ K * AC B
$ 輸出樣例: KGCBDHQMPY BAC 大意是讓我們對每一個數據集建立一個二叉樹,這個二叉樹是很特殊的,它是一個二叉查找樹(觀察左右子樹與根結點的關系,左子樹比其小,右子樹大),所以我們不難寫出代碼,這個題是一道二叉查找樹的基礎例題。 代碼如下:
#include<cstdio>#include<string>#include<queue>#include<iostream>using namespace std;struct node{ char data; node* lch; node* rch;}*root;void insert(node *&root,char x){ if(root==NULL) { root=new node; root->data=x; root->lch=NULL;//一定要對左右子樹賦初值NULL root->rch=NULL; return; } if(root->data==x) return; else { if(x-'A'>root->data-'A') { insert(root->rch,x); } if(x-'A'<root->data-'A') { insert(root->lch,x); } }}void fir(node *root){ if(root==NULL) return; else {新聞熱點
疑難解答