/*
重建二叉樹:
給定一顆二叉樹,假設每個節點都用唯一的字元來表示
假設已經有了前序和中序遍歷結果,希望通過乙個演算法來重建這課樹
給定函式如下
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 ...