二叉树常见问题

本文深入探讨了二叉树的常见问题,包括遍历(前序、中序、后序)、查找、插入和删除操作。通过实例解析了二叉搜索树、平衡二叉树以及满二叉树的特性,并介绍了如何解决二叉树的平衡问题。
摘要由CSDN通过智能技术生成
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值