using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataList.Study.Trees
{
/// <summary>
/// 树:只有一个根节点,父子节点用线连接起来,兄弟节点不去连,一个节点有俩个子树的树叫二叉树
/// 俩种二叉树:完全二叉树(叶子节点在最后一层和倒数第二层,最后一层的节点都在左子树上),满二叉树(叶子节点都在最后一层)
/// 二叉树的遍历:前,中,后,三种遍历方式
/// 树的俩种存储方式:一种是数组存储(完全二叉树适用于数组存储,不会照成空间上的浪费,只会浪费一个0下标地址的空间),一种是链式存储(适合所有的数存储)
/// 二叉查找树:二叉查找树是完全二叉树,节点的左子树都小于该节点,节点的右子树多大于该节点,二叉查找树的常见操作是动态添加,删除,查找节点(这些操作的时间复杂度与高度成正比,log2N)
/// </summary>
class BinaryTree
{
BinaryNode root;
public BinaryTree() {
}
public BinaryTree(BinaryNode root) {
this.root = root; }
public void OrderFirst(BinaryNode p)
{
Console.WriteLine(p.Data);
OrderFirst(p.LeftNode);
OrderFirst(p.RightNode);
}
public void OrderMid(BinaryNode p)
{
Console.WriteLine(p.LeftNode);
Console.WriteLine(p.Data);
Console.WriteLine(p.RightNode);
}
public void OrderTail(BinaryNode p)
{
Console.WriteLine(p.LeftNode);
Console.WriteLine(p.RightNode);
Console.WriteLine(p.Data);
}
/// <summary>
/// 按层遍历(广度优先遍历)
/// </summary>
/// <param name="node"></param>
/// <param name="value"></param>
/// <returns></returns>
///
public void LevelOrder()
{
if (root == null) return ;
//广度优先用队列操作
Queue<BinaryNode> q = new Queue<BinaryNode>();
q.Enqueue(root);
while (q.Count() > 0)
{
BinaryNode temp = q.Dequeue();
if (temp.LeftNode != null)
q.Enqueue(temp.LeftNode);
if (temp.RightNode != null)
q.Enqueue(temp.RightNode);
}
}
public BinaryNode SerchValue(BinaryNode node, int value)
{
BinaryNode p = node;
if (p == null) return null;
while (p != null)
{
if (value > p.Data)
p = p.RightNode;
else if (value < p.Data)
p = p.LeftNode;
else
return p;
}
return null;
}
public void InsertValue(int value)
{
if (root == null)
root =new BinaryNode(value);
BinaryNode p = root;
BinaryNode q = new BinaryNode(value);
while (p != null)
{
if (value > p.Data)
{
if (p.RightNode == null)
{
p.RightNode = q;
return;
}
p = p.RightNode;
}
else
{
if (p.LeftNode == null)
{
p.LeftNode = q;
return;
}
p = p.LeftNode;
}
}
}
public void DeleteNode(int value)
{
if (root == null) return;
BinaryNode p = root;//要删除的节点
BinaryNode pp = null;//要删除节点的父节点
while (p != null)
{
pp = p;
if (value > p.Data)
p = p.RightNode;
else
p = p
二叉树常见问题
最新推荐文章于 2023-02-05 23:38:19 发布
本文深入探讨了二叉树的常见问题,包括遍历(前序、中序、后序)、查找、插入和删除操作。通过实例解析了二叉搜索树、平衡二叉树以及满二叉树的特性,并介绍了如何解决二叉树的平衡问题。
摘要由CSDN通过智能技术生成