程式設計之美 第三章 結構之法 3 9重建二叉樹

2021-07-04 06:32:52 字數 2301 閱讀 9066

/*

重建二叉樹:

給定一顆二叉樹,假設每個節點都用唯一的字元來表示

假設已經有了前序和中序遍歷結果,希望通過乙個演算法來重建這課樹

給定函式如下

void rebuild(char* ppreorder,char* pinorder,int itreelen,node** proot)

itreelen:樹的長度,proot返回node** 型別,根據前序和中序遍歷結果重新構建樹的根節點

ab c

d e f

輸入:abdcef(前序)

dbaecf(中序)

輸出:dbefca

*//*

關鍵:1 這道題目與王道解法不同之處在與,沒有使用下限與上限,而是直接使用了樹的長度,並且通過直接對字串的指標進行加,來達到去除上下限引數的方法

2 檢查邊界,獲得前序遍歷第乙個節點,設定左右孩子為空。如果根節點為空,把當前節點複製到根節點;如果當前樹長度為1,那麼已經是最後乙個節點,直接返回

,尋找子樹長度,找打左子樹的結尾。計算左子樹長度和右子樹長度,左子樹長度》0,重建左子樹,右子樹長度》0,重建右子樹

3 if(!(*proot))//如果根節點為空,就將當前節點複製到根節點

4 if(itreelen == 1)//遞迴出口,如果當前樹的長度為1,表示已經是最後乙個節點,後面的左右子樹尋找就不需要做了

5 int irightlen = itreelen - ileftlen - 1;//注意這裡的-1代表根節點,要去除

6 if(ilen > itreelen)//如果超出長度,直接退出

7 if(ileftlen > 0)//左子樹不空,建立左子樹

8 rebuild(ppreorder + ileftlen + 1,pinorder + ileftlen + 1,irightlen,&((*proot)->_pright));//注意這裡要pinoder+ileftlen+1因為要跳過根節點

*/#include #include #include using namespace std;

const int maxsize = 10000;

const int treelen = 6;

typedef struct node

node;

node g_nodearr[maxsize];

int g_iindex;

node* createnode()

/*重建思路:

檢查邊界,獲得前序遍歷第乙個節點,設定左右孩子為空。如果根節點為空,把當前節點複製到根節點;如果當前樹長度為1,那麼已經是最後乙個節點,直接返回

,尋找子樹長度,找打左子樹的結尾。計算左子樹長度和右子樹長度,左子樹長度》0,重建左子樹,右子樹長度》0,重建右子樹

*/void rebuild(char* ppreorder,char* pinorder,int itreelen,node** proot)

node* ptemp = createnode();//獲得前序遍歷的第乙個節點

ptemp->_chval = *ppreorder;

if(!(*proot))//如果根節點為空,就將當前節點複製到根節點

if(itreelen == 1)//遞迴出口,如果當前樹的長度為1,表示已經是最後乙個節點,後面的左右子樹尋找就不需要做了

char* porginorder = pinorder;//計算左右子樹的長度

char* pleft = pinorder;

int ilen = 0;

while(*ppreorder != *pleft)

ilen++;

if(ilen > itreelen)//如果超出長度,直接退出

pleft++;

} int ileftlen = (int)(pleft - porginorder);

int irightlen = itreelen - ileftlen - 1;//注意這裡的-1代表根節點,要去除

if(ileftlen > 0)//左子樹不空,建立左子樹

if(irightlen > 0)//右子樹不空,建立右子樹 }

void backvisit(node* proot)

backvisit(proot->_pleft);

backvisit(proot->_pright);

printf("%c",proot->_chval);

}void process()

}int main(int argc,char* argv)

程式設計之美 第三章 結構之法 3 11程式改錯

程式改錯 找出乙個有序字串陣列arr中值等於字串v的元素的序號,如果有多個元素滿足這樣的條件,則返回其中序號最大的 程式中的錯誤 1 midindex minindex maxindex 2 這樣可能會由於求和中間結果而溢位,應該改為midindex minindex maxindex minind...

程式設計之美 3 9重建二叉樹

題目 給定一棵二叉樹,假定每個節點都用唯一的字元表示,具體結構如下 struct node 假設已經有了前序遍歷和中序遍歷結果,希望通過乙個演算法重建這棵樹。給定函式的定義如下 void rebuild char ppreorder,char pinorder,int ntreelen,node p...

程式設計之美 3 9 重建二叉樹

1.簡述 給定一棵二叉樹,假定每個節點都用唯一的字元表示,具體結構如下 struct node 假設已經有了前序遍歷和中序遍歷結果,希望通過乙個演算法重建這棵樹。給定函式的定義如下 void rebuild char ppreorder,char pinorder,intntreelen,node ...