通常對於二叉樹的建立採用兩種方式:遞迴建立和非遞迴建立。本文在這裡採用遞迴方法建立二叉樹,並且敘述有關二叉樹三種遍歷方式以及求有關節點的相關問題等。
首先定義乙個有關二叉樹的結構體,結構體中包含整型的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.當輸入遇到非 但棧中元素小於...