C語言二叉排序樹的建立
阿新 • • 發佈:2018-12-31
在實際應用中,很多場合會涉及到資料結構中的樹,二叉樹作為最簡單的樹,則有很多重要的用處。而二叉樹又細分為好多型別,在此只說二叉排序樹,這種型別的樹有個比較好的特性就是,中序遍歷這棵樹,你將得到一個按升序排列的陣列。下面以一維陣列來建立一棵二叉排序樹。
執行程式,將得到:1 2 3 4 6 7 9 13 17 18 20 。不過二叉排序樹有個不好的方面是,每個節點上左右樹的深度可能差別比較大,比如有個陣列為 1 2 3 4 6 7 9 13 17 18 20,它的樹就是1→ 2 →3→4→ 6→→9→13→17→18→20#include "stdafx.h" #include <iostream> #include <vector> using namespace std; typedef struct Tree { int Data; struct Tree *LeftTree;//左子樹 struct Tree *RightTree;//右子樹 }TreeNode, *TreeNodeP; void InsertNode(TreeNodeP &TreeRoot, int Data) { //新建一個節點 TreeNodeP NodeP; NodeP = (TreeNodeP)malloc(sizeof(TreeNode)); NodeP->Data = Data; NodeP->LeftTree = NodeP->RightTree = NULL; //如果樹根還沒建立,那就把當前新建的節點賦給根吧 if (TreeRoot == NULL) { TreeRoot = NodeP; } //新插入的節點數值比根的小或等,走根的左邊 else if (Data <= TreeRoot->Data) { //左子樹遞迴結束處 if (TreeRoot->LeftTree == NULL) TreeRoot->LeftTree = NodeP; //左遞迴 else InsertNode(TreeRoot->LeftTree, Data); } //新插入的節點數值比根的大,走根的右邊 else if (Data > TreeRoot->Data) { //右子樹遞迴結束處 if (TreeRoot->RightTree == NULL) TreeRoot->RightTree = NodeP; //右遞迴 else InsertNode(TreeRoot->RightTree, Data); } } void TraveseTreeNode(TreeNodeP TreeRoot, int Mode) { if (TreeRoot) { //先序遍歷 if (Mode == 1) { printf("NodeData=%d\n", TreeRoot->Data); TraveseTreeNode(TreeRoot->LeftTree, Mode); TraveseTreeNode(TreeRoot->RightTree, Mode); } //中序遍歷 else if (Mode == 2) { TraveseTreeNode(TreeRoot->LeftTree, Mode); printf("NodeData=%d\n", TreeRoot->Data); TraveseTreeNode(TreeRoot->RightTree, Mode); } //後序遍歷 else if (Mode == 3) { TraveseTreeNode(TreeRoot->LeftTree, Mode); TraveseTreeNode(TreeRoot->RightTree, Mode); printf("NodeData=%d\n", TreeRoot->Data); } } } int main() { TreeNodeP Tree = NULL; int A[11] = { 1, 6, 18, 3, 7, 17, 20, 2, 4, 13, 9 }; for (int i = 0; i < 11; i++) { InsertNode(Tree, A[i]); } TraveseTreeNode(Tree, 2); return 0; }
這棵樹根本沒左子樹啥事。即節點上的左右子樹的深度失衡,這個問題將由平衡二叉樹來解決。後面有時間寫一下。