今天和大家分享乙個二叉搜尋樹的實現演算法,二叉搜尋樹是若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值,如下圖
為了能讓這個樹更加完整,不那麼散亂,我將他包裝起來成為一棵樹,然後想,一棵樹裡要寫啥,那肯定是要乙個根節點啦,於是把構建結點和樹的結構體寫出來。
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 解釋 輸入為 ...