二叉排序樹(binary sort tree)又稱二叉查詢樹(binary search tree),亦稱二叉搜尋樹。 它或者是一棵空樹;或者是具有下列性質的二叉樹
:(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結
點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
插入操作:
首先執行查詢演算法,找出被插結點的父親結點。
判斷被插結點是其父親結點的左、右兒子。將被插結點作為
葉子結點插入。
若 二叉樹為空。則首先單獨生成根結點。
注意:新插入的結點總是
葉子結點。
#include #include typedef struct treenode *tree;
struct treenode
treenode;
//二叉搜尋樹 的遞迴插入
tree insert(tree root,int element)
else if(root->num >= element)
else
return root;
}//二叉搜尋樹 的迭代插入
tree insert2(tree root,int element)
while(tmp)
else
}if(flag)
before->right = node;
else
before->left = node;
return root;
}//遞迴前序遍歷
void preorder(tree root)
}//迭代前序遍歷 下面是c++**
/* 思想:從根節點開始,先列印節點資訊(獲取資料),如果節點有右孩子,則有孩子入棧;
如果有左孩子,當前指標指向左孩子,沒有左孩子的話,出棧。繼續這個過程,直到獲取棧元素的時候棧為空。
void preorder(binarytreenode* proot)
} } */
//遞迴中序遍歷
void inorder(tree root)}/*
void inorder(binarytreenode* proot)
//若進行到這裡左子樹為空
if (!s.empty()) //stack不空時退棧,然後訪問該元素
} while (p!=null||!s.empty());
//這裡的p==null表示右子樹為空,然後堆疊如果也空的話,才是處理完畢
} */
//遞迴後序遍歷
void postorder(tree root)
}/*迭代後序遍歷
void postorder(binarytreenode* proot)
bool continuel=true; //繼續迴圈標誌,用於l改為r的時候就開始向右遍歷
while (continuel && !s.empty()) //用乙個break語句也能實現迴圈標誌continuel的功能
else
visit(p); //如果標記為r,表示右子樹遍歷完
} }while (!s.empty());
} */
int main(int argc,char **argv)
; int i;
tree tree=null;
for(i=0; i<10; i++)
printf("preorder:\n");
preorder(tree);
printf("\ninorder\n");
inorder(tree);
printf("\npostorder\n");
postorder(tree);
return 0;
}
二叉搜尋樹的插入 刪除與遍歷
二叉搜尋樹是有序的,插入之後要使插入後的樹還是有序的,就必須比較每個節點的值,然後再選擇合適的位置插入,首先先將樹的節點設計如下 typedef int elemtype typedef struct bstnode bstnode 插入的方式實現了兩種,一種是遞迴方式,一種是非遞迴實現。非遞迴 購...
二叉樹的遍歷 查詢 插入以及刪除
二叉樹的主要儲存方式是鏈結儲存,標準儲存結構也稱為二叉鍊錶。二叉鍊錶結點類的定義 struct node 常見的二叉樹遍歷方式下面給個例項來表示具體的遍歷方式 前序遍歷訪問順序 訪問根結點 左子樹 右子樹。首先訪問根結點a,然後左子樹l 因為l也採用前序遍歷的方式,則首先訪問l的左子樹b,b沒有孩子...
jS生成二叉樹,二叉樹的遍歷,查詢以及插入
js遞迴,二叉樹的操作 遞迴演算法n次冪 function foo n else nodes 遞迴樹形節點 function output node output nodes 二叉樹 var tree right right right 二叉樹遍歷 遞迴演算法,容易導致執行棧溢位 function ...