輸入二叉樹的前序遍歷和中序遍歷,重建出該二叉樹

2021-07-11 17:48:55 字數 2828 閱讀 4040

eg:前序遍歷:;

中序遍歷:;

二叉樹結點定義如下:

struct binarytreenode

c++實現函式說明:

本題的函式主要是有參建構函式:binarytree(int* pre, int* inorder, int len);

有參建構函式呼叫函式:binarytreenode* _createbinarytree(binarytreenode*& root,int*& pre, int*& inorder, int len);

此函式又呼叫了主要函式:binarytreenode* _realcreatetree(binarytreenode*& root,int* startpre, int* endpre, int* startin, int* endin);

函式void _destorybinarytree(binarytreenode*& root);:遞迴銷毀一棵樹;

分析如下:

1.先根據先序遍歷建立出根結點:root;

2.再通過中序遍歷找出根結點,用根結點的下標計算出左子樹的個數;

3.再通過左子樹的個數計算出在先序遍歷中左子樹結尾的位置;

4.通過以上計算,我們已經將二叉樹分為左子樹和右子樹,然後大問題化作小問題;

5.遍歷左子樹;

6.遍歷右子樹;

依據上面的思路構建出的二叉樹如上圖:

**如下:

#includeusing namespace std;

struct binarytreenode

};class binarytree

binarytree(int* pre, int* inorder, int len)

~binarytree()

private:

void _destorybinarytree(binarytreenode*& root)

if (tmp->_right)

delete tmp;

tmp = null;

} }binarytreenode* _createbinarytree(binarytreenode*& root,int*& pre, int*& inorder, int len)

return _realcreatetree(root, pre, pre + len - 1, inorder, inorder + len - 1);

} binarytreenode* _realcreatetree(binarytreenode*& root,int* startpre, int* endpre, int* startin, int* endin)

else

}//2.有多個結點

int* rootin = startin;

while (rootin < endin && *rootin != root->_value)

if (rootin == endin && *rootin != root->_value)

//1.通過中序遍歷計算左子樹的節點個數leftlen

//2.通過計算出的左子樹個數,再計算先序遍歷中的左子樹中的最後乙個節點位置preleftofend

int leftlen = rootin - startin;

int* preleftofend = startpre + leftlen;

//構建左子樹

if (leftlen > 0)

//構建右子樹

if (leftlen < endpre - startpre)

return root;

}private:

binarytreenode* root;

};void test()

; int in = ;

int len = sizeof(pre) / sizeof(pre[0]);

binarytree bt(pre, in, len);

}void test2()

; int in = ;

int len = sizeof(pre) / sizeof(pre[0]);

binarytree bt(pre, in, len);

}void test3()

; int in = ;

int len = sizeof(pre) / sizeof(pre[0]);

binarytree bt(pre, in, len);

}void test4()

; int in = ;

int len = sizeof(pre) / sizeof(pre[0]);

binarytree bt(pre, in, len);

}void test5()

; int in = ;

int len = sizeof(pre) / sizeof(pre[0]);

binarytree bt(pre, in, len);

}void test6()

; int in = ;

int len = sizeof(pre) / sizeof(pre[0]);

binarytree bt(pre, in, len);

}int main()

除test6()外,所有測試都可以通過除錯去看構造出的二叉樹結構;

test6()測試不匹配的結果如下圖所示:

前序遍歷和中序遍歷重建二叉樹

根據先序序列和中序序列的特點我們可以知道 1 先序的第乙個節點是根節點 2 在中序序列中,根結點前邊的結點都是左子樹中的,根結點右邊的結點都是右子樹中的 3 通過左右子樹的中序序列帶入前序序列可以求出左右子樹的前序序列 4 左右子樹的前序序列第乙個元素分別是根節點的左右孩子 5 可以遞迴上述步驟來重...

二叉樹的前序遍歷 中序遍歷和後序遍歷

include includeusing namespace std typedef struct bitnodebitnode,bitree void initbitree bitree t 構造空二叉樹 void createbitree bitree t 生成二叉樹 void preorder...

二叉樹的遍歷 前序遍歷 中序遍歷 後序遍歷

二叉樹的遍歷分為前序遍歷 中序遍歷 後序遍歷 前序遍歷是指,對於樹中的任意節點來說,先列印這個節點,然後再列印它的左子樹,最後列印它的右子樹。中序遍歷是指,對於樹中的任意節點來說,先列印它的左子樹,然後再列印它本身,最後列印它的右子樹。後序遍歷是指,對於樹中的任意節點來說,先列印它的左子樹,然後再列...