C語言搜尋二叉樹

2021-10-03 16:22:07 字數 1592 閱讀 2667

今天和大家分享乙個二叉搜尋樹的實現演算法,二叉搜尋樹是若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值,如下圖

為了能讓這個樹更加完整,不那麼散亂,我將他包裝起來成為一棵樹,然後想,一棵樹裡要寫啥,那肯定是要乙個根節點啦,於是把構建結點和樹的結構體寫出來。

typedef

struct node

node;

typedef

struct tree

tree;

插入函式的思想是:首先,插入肯定是插入乙個結點,所以開始要整出乙個結點(整出來必須初始化),為了樹的根節點不要變化(為什麼不要變化:因為後面我們要遍歷的時候需要根節點),所以還要定義乙個臨時的結點來代替根節點,然後當資料傳過來時,就比較該資料是不是大於根節點資料,如果是大於,那就放右邊,但是放右邊你要想,右邊要是空才可以放啊,所以再判斷右邊是不是空,如果是空,那麼就可以放,如果不是,那麼就要往下移,具體見**

int

insert

(tree* tree,

int data)

else

else

temp=temp->left;

}else

else

temp=temp->right;}}

}return1;

}

遍歷有三種:前序遍歷(根左右),中序遍歷(左根右),後序遍歷(左右根),所以我們遍歷的時候只需要傳入根節點,然後用遞迴的思想,就可以實現啦!

void

preprint

(node* head)

//前序遍歷

}void

midprint

(node* head)

//中序遍歷

}void

lastprint

(node* head)

//後序遍歷

}

在主函式中,首先要整出一棵樹來,整出來必須初始化,然後將資料傳進去,資料輸入可以採用scanf,然而我這裡就直接定義陣列了,然後驗證一下前序,中序遍歷。

int

main()

,i; tree tree;

tree.root=

null

;//一定要初始化

for(i=

0;i<

6;i++

)printf

("前序遍歷:\n");

preprint

(tree.root)

;printf

("中序遍歷:\n");

不知道大家有沒有發現,搜尋二叉樹的中序遍歷都是由小到大排序好的,有總結,有收穫,o啦

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

判斷給定二叉樹是否二叉搜尋樹 C語言

題設要求 1 函式介面說明 bool isbst bintree t 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 函式isbst須判斷給定的t是否二叉搜尋樹,即滿足如下定義的二...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...