人們時常選擇二叉樹超過諸如數組和鏈表真陽的較為基礎的數據結構,因為人們可以快速的查找二叉樹(相對於鏈表),還可以迅速的二叉樹中插入和拆除數據(相對於數組)。
人們把每個節點最擁有不超過兩個子節點的樹定義為二叉樹。
二叉查找樹是一種吧較小數據存儲在左節點二較大數據存儲在右節點的二叉樹。
Public class Node
{
Public int Data;
Public Node left;
Public Node right;
Public void DisplayNode()
{
Console.writeline(Data);
}
}
Public class BinarySearchTree()
{
Public Node root;
Pbulic BinarySearchTree()
{
root=null;
}
Public void Insert(int i)
{
Node newNode=new Node();
newNode.Data=i;
If(root==null)
{
Root=newNode;
}
Else
{
Node CurrentNode=root;
Node ParentNode=null;
While(true)
{
ParentNode=CurrentNode;
If(i<CurrentNode.Data)
{
CurrentNode=CurrentNode.Left;
If(CurrentNode==null)
{
CurrentNode.Left=newNode;
Break;
}
}
Else
{
CurrentNode=CurrentNode.Right;
If(CurrentNode==null)
{
CurrentNode.Right=newNode;
Break;
}
}
}
}
Public void Inorder(node theRoot) // 中序遍歷
{
If(!(theRoot==null))
{
Inorder(theRoot.left);
theRoot.DisplayNode();
Inorder(theRoot.right);
}
}
Public void PreOrder(node theRoot) //先序遍歷
{
If(!(theRoot==null))
{
theRoot.DisplayNode();
PreOrder(theRoot.Left);
PreOrder(theRoot.Right);
}
}
Public void PostOrder(node theRoot) //后續遍歷
{
If(theRoot==null)
{
PostOrder(theRoot.Left);
PostOrder(theRoot.Right);
theRoot.DisplayNode();
}
}
Public void LevelOrdr(node theRoot) // 廣度優先遍歷 借助隊列
{
Queue que=new Queue();
que.Enqueue(theRoot);
While(que.Count )
{
Node node=(Node).que.Dequeue();
Console.Wite(node);
If(node.Left!=null)
{
que.Enqueue(node.Left);
}
If(node.Right!=null)
{
que.Enqueue(node.Right);
}
}
}
Public int findMain()
{
Node CurrentNode=root;
While(CurrentNode.left!=null)
{
CurrentNode=CurrentNode.Left;
}
Return CurrentNode.Data;
}
Public int findMax()
{
Node CurrentNode=root;
While(CurrentNode.right!=null)
{
CurrentNode=CurrentNode.right
}
Return CurrentNode.Data;
}
Public Node Find(int key)
{
Node current=root;
While(curent.data!=key)
{
If(key<current.data)
Curent=current.Left;
Else
Current=current.Right;
If(current==null)
Return null;
}
Return current;
}
}
public bool Delete(int key)
{
Node current = root;
Node parent = root;
bool isLeftChild = true;
while (current.Data != key)
{
parent = current;
if (key < current.Data)
{
isLeftChild = true;
current = current.Right;
}
else
{
isLeftChild = false;
current = current.Right;
}
if (current == null)
return false;
}
if ((current.Left == null) & (current.Right == null))
if (current == root)
root = null;
else if (isLeftChild)
parent.Left = null;
else if (current.Right == null)
if (current == root)
root = current.Left;
else if (isLeftChild)
parent.Left = current.Left;
else
parent.Right = current.Right;
else if (current.Left == null)
if (current == root)
root = current.Right;
else if (isLeftChild)
parent.Left = parent.Right;
else
parent.Right = current.Right;
else
{
Node successor = GetSuccessor(current);
if (current == root)
root = successor;
else if (isLeftChild)
parent.Left = successor;
else
parent.Right = successor;
successor.Left = current.Left;
}
return true;
}
}
二叉樹遍歷(Traversal)是按照某種順序對樹中的每個節點訪問,且只訪問一次的過程。二叉樹遍歷是本質上是將非線性結構線性化。
二叉樹深度優先遍歷
D 二叉樹的某一節點
L ,R 分別為節點D的左右樹。
先序 DLR DRL
中序 LDR RDL
后序 LRD LRD
深度優先搜索子孫節點再搜索節點的兄弟節點。廣度遍歷先搜索所有兄弟節點,再搜索子孫節點。
二叉查找樹三件最容易的事情 : 查找特定值,找到最下值 ,找最大值。