二叉树简介
在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。
二叉查找树
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;
C#添加二叉查找树
算法步骤:
1)创建根节点,并将根节点设为空。
2)判断当前插入节点,若此时根节点为空将其设为根节点,否则执行第三步。
3)将根节点设置为当前点,判断节点与当前点大小关系,若小于当前点,则将根节点左节点设为当前点,若当前点为空,则将待插入节点插入当前点,否则执行第四步。若大于当前点,则将根节点右节点设为当前点,若当前点为空,则将待插入节点插入当前点,否则执行第四步。
4)进行新一轮循环查找。
5)当找到插入节点位置(父节点的左节点或是右节点为空),退出循环。
算法程序:
public void Insert(int i)
{
Node newNode=new Node();
newNode.Data=i;
if (root == null) //判断根节点是否为空
{
root = newNode;
}
else
{
Node current = root;
Node parent;
while (true) //循环查找插入位置
{
parent = current;
if (i < current.Data) //小于当前节点
{
current = current.Left; //将左节点作为当前节点
if (current == null)
{
parent.Left = newNode; //获得插入位置
break; //退出循环
}
}
else
{
current = current.Right;
if (current == null)
{
parent.Right = newNode;
break;
}
}
}
}
}
{
Node newNode=new Node();
newNode.Data=i;
if (root == null) //判断根节点是否为空
{
root = newNode;
}
else
{
Node current = root;
Node parent;
while (true) //循环查找插入位置
{
parent = current;
if (i < current.Data) //小于当前节点
{
current = current.Left; //将左节点作为当前节点
if (current == null)
{
parent.Left = newNode; //获得插入位置
break; //退出循环
}
}
else
{
current = current.Right;
if (current == null)
{
parent.Right = newNode;
break;
}
}
}
}
}
二叉树遍历
中序遍历:
protected void InOrde(Node node)
{
InOrde(node.Left);
node.DispalyNode();
InOrde(node.Right);
}
{
InOrde(node.Left);
node.DispalyNode();
InOrde(node.Right);
}
后序遍历:
public void PostOrder(Node node)
{
if (node != null)
{
InOrder(node.Left);
InOrder(node.Right);
node.DispalyNode();
}
}
{
if (node != null)
{
InOrder(node.Left);
InOrder(node.Right);
node.DispalyNode();
}
}
先序遍历:
public void PreOrder(Node node)
{
if (node != null)
{
node.DispalyNode();
InOrder(node.Left);
InOrder(node.Right);
}
}
{
if (node != null)
{
node.DispalyNode();
InOrder(node.Left);
InOrder(node.Right);
}
}