遞迴建立二叉樹

2021-08-29 16:12:04 字數 3252 閱讀 8366

通常對於二叉樹的建立採用兩種方式:遞迴建立和非遞迴建立。本文在這裡採用遞迴方法建立二叉樹,並且敘述有關二叉樹三種遍歷方式以及求有關節點的相關問題等。

首先定義乙個有關二叉樹的結構體,結構體中包含整型的data,以及結構體型別的左右子樹left和right。然後是建立有關二叉樹的結點,相關**如下:

typedef int  datatype;

typedef struct bstreenode bstreenode;

bstreenode *createnode(int data)

對於建立二叉樹,我採用了先序遍歷的方法遞迴建立二叉樹,下圖是我的構思(用#號代表空結點):

下面**中使用-1替換了上圖中的#號來表示空結點,這裡使用 preorder來儲存結點元素,然後定義了乙個整形指標pusedsize來標記在建立二叉樹過程中已經使用過的元素個數,**如下:

//建立出樹的根節點

//建立過程中,使用的字元個數

bstreenode *createtree(int preorder, int size, int *pusedsize)

int leftuse, rightuse;

int rootvalue = preorder[0];

if (rootvalue == -1)

bstreenode *root = createnode(rootvalue);

root->left = createtree(preorder + 1, size - 1, &leftuse);

root->right = createtree(preorder + 1 + leftuse, size - 1 - leftuse, &rightuse);

//向老大報告實際使用情況

*pusedsize = 1 + leftuse + rightuse;

return root;

}

void test()

; int size = sizeof(preorder) / sizeof(int);

int usedsize;

bstreenode *root = createtree(preorder, size, &usedsize); }

int main()

測試結果如下:

//前序遍歷

void preorder(bstreenode *root)

// 根

printf("%d ", root->data);

// 左子樹,子問題用遞迴處理

preorder(root->left);

// 右子樹,子問題用遞迴處理

preorder(root->right);

}//中序遍歷

void inorder(bstreenode *root)

inorder(root->left);

printf("%d ", root->data);

inorder(root->right);

}//後序遍歷

void postorder(bstreenode *root)

// 左子樹,子問題用遞迴處理

postorder(root->left);

// 右子樹,子問題用遞迴處理

postorder(root->right);

// 根

printf("%d ", root->data);

}

三種遍歷結果如下:

1.求二叉樹的節點個數問題,這裡採用後序遍歷二叉樹,定義乙個全域性整形變數count來統計節點個數,**如下:

//求樹的結點的個數

int count = 0;

int getsize1(bstreenode *root)

getsize1(root->left);

getsize1(root->right);

count++;

return count;

}

2.求有關二叉樹葉子節點個數的問題,**如下:

//求葉子節點個數

int geatleafsize(bstreenode *root)

else

else}}

3.求二叉樹第k層節點個數的問題,**如下:

//求第k層節點個數

int getlevelksize(bstreenode *root, int k)

if (k ==1)

int left = getlevelksize(root->left, k - 1);

int right = getlevelksize(root->right, k - 1);

return left + right;

}

4.求二叉樹高度的問題,**如下:

//求樹的高度

#define max(a ,b) ((a)>(b)? (a):(b))

int getheight(bstreenode *root)

//當子樹有乙個節點的時候,可以寫,也可以不寫

//寫的話,節省兩次函式呼叫

return max(getheight(root->left), getheight(root->right)) + 1;

}

//查詢元素

bstreenode *find(bstreenode *root, datatype data)

if (root->data == data)

bstreenode *result = find(root->left, data);

if (result != null)

result = find(root->right, data);

if (result != null)

else

}

遞迴建立二叉樹

coding utf 8 coding utf 8 class treenode def init self,val,left none right none self.val val self.left left self.right right defcreattree node treenod...

非遞迴建立二叉樹

通過二叉鍊錶建立二叉樹,二叉鍊錶的節點結構如下 template class t struct binode 二叉樹類的結構如下 template class t class bitree 二叉樹建立的過程如下圖所示 可以利用棧來實現非遞迴建立,另外還需要建立一種棧節點結構,該結構包括 注意 sta...

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...