由前序遍歷和中序遍歷構建二叉樹(C 語言)

2021-10-10 22:13:32 字數 1952 閱讀 9774

不要自卑,去提公升實力

網際網路行業誰技術牛誰是爹

如果文章可以帶給你能量,那是最好的事!請相信自己

加油o~

設計思路:

char* pre為前序遍歷的順序

char* in為中序遍歷的順序

首先建立乙個指標p,用迴圈在in中找到根節點

left為左子樹個數=p-in(指標差值)

right為右子樹個數(n-left-1)

之後遞迴呼叫該函式構建左右子樹

**:

/**

*2023年11月27日,下午15:50

*/#include

using

namespace std;

class

node

node

(char ch, node* left, node* right)};

//二叉樹的前序遍歷

void

preorder

(node* root)

cout << root-

>ch <<

" ";

preorder

(root-

>left)

;preorder

(root-

>right);}

//二叉樹的中序遍歷

void

midorder

(node* root)

midorder

(root-

>left)

; cout << root-

>ch <<

" ";

midorder

(root-

>right);}

//二叉樹的後序遍歷

void

postorder

(node* root)

postorder

(root-

>left)

;postorder

(root-

>right)

; cout << root-

>ch <<

" ";

}//由前序遍歷和中序遍歷構建二叉樹

node*

buildtree

(char

* pre,

char

* in,

int n)

node* root =

newnode()

; root-

>ch =

*pre;

char

* p;

//在中序中找到根節點

for(p = in; p < in + n; p++)}

int left = p - in;

//左子樹個數

int right = n - left -1;

//右子樹個數

//遞迴構建左子樹

root-

>left =

buildtree1

(pre +

1, in, left)

;//遞迴構建右子樹

root-

>right =

buildtree1

(pre + left +

1, p +

1, right)

;return root;

}int

main()

;char b=

; node* root =

newnode()

; root =

buildtree

(a, b,6)

;preorder

(root)

;midorder

(root)

;}

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

唯一的難點就是確定當前節點的左子樹的根節點和右子樹的根節點分別在前序遍歷陣列的位置。例如 先序遍歷陣列pre 1 2 3 4 5 6 7 中序遍歷陣列in 3 2 4 1 6 5 7 1是當前根節點,它在pre中的位置 pre start 0接著在in中找到1的位置,即分割點 j 3當前樹根所囊括的...

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

程式設計之美3.9 給出前序遍歷和中序遍歷,重新建立二叉樹,後序遍歷輸出。如下 view code 1 include 2 include 3 4using namespace std 56 struct node7 1213 void aftertra node proot 1419 aftert...

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

由前序遍歷和中序遍歷重建二叉樹 前序序列 1 2 3 4 5 6 中序序列 3 2 4 1 6 5 思路 前序遍歷第乙個是根節點。中序遍歷根節點左側為左子樹,根右側為右子樹。那麼先構造根節點,根節點左側都為左子樹,根右側都為右子樹。然後對左右子樹遞迴式的構造即可。封裝 binarytreenode ...