二叉树之查找树的C#实现_c#查找树结构再无子节点的代码-程序员宅基地

在下小白一个 如果有错误请指正

上代码:

 

using System;
//数据结构

namespace DataStructure
{
    /// <summary>
    /// 二叉树的实现
    /// </summary>
    /// 

    #region 二叉树的分类

    //     满二叉树
    //        4
    //      /   \
    //     3     5
    //    / \   / \
    //   2   6 1   7

    //     完全二叉树 只有最下面节点数可以小于2并且最下层叶节点集中到左侧
    //         4
    //        / \
    //       3   5
    //      /\   /
    //     2  7 1
    //       /
    //      6

    //     二叉查找树 节点中包含关键字key

    #endregion

    /// <summary>
    /// 二叉树节点
    /// </summary>
    public class TreeNode<T> where T : IComparable<T>
    {
        /// <summary>
        /// key
        /// </summary>
        public T MKey;

        /// <summary>
        /// 父节点
        /// </summary>
        public TreeNode<T> ParentNode;

        /// <summary>
        /// 左侧子节点
        /// </summary>
        public TreeNode<T> LeftChildNodes;

        /// <summary>
        /// 右侧子节点
        /// </summary>
        public TreeNode<T> RightChildNodes;

        /// <summary>
        /// 颜色
        /// </summary>
        public ColorType Mcolor;

        public TreeNode(T key, TreeNode<T> parentNode, TreeNode<T> leftNode, TreeNode<T> rightNode)
        {
            MKey = key;
            ParentNode = parentNode;
            LeftChildNodes = leftNode;
            RightChildNodes = rightNode;
        }

        public TreeNode()
        {
            LeftChildNodes = null;
            RightChildNodes = null;
        }
    }

    public class BinaryTree<T> where T : IComparable<T>
    {
        public TreeNode<T> MRoot;

        public BinaryTree()
        {
            MRoot = null;
        }

        /// <summary>
        /// 增加节点(增)
        /// </summary>
        /// <param name="tree"></param>
        /// <param name="node1"></param>要插入的树
        protected virtual void InsetNode(BinaryTree<T> tree, TreeNode<T> node1)
        {
            int cmp;
            TreeNode<T> node2 = null;
            TreeNode<T> node = tree.MRoot;
            while (node != null)
            {
                node2 = node;
                cmp = node1.MKey.CompareTo(node.MKey);
                node = cmp < 0 ? node.LeftChildNodes : node.RightChildNodes;
            }

            node1.ParentNode = node2;
            if (node2 == null)
                tree.MRoot = node1;

            else
            {
                cmp = node1.MKey.CompareTo(node2.MKey);
                if (cmp > 0)
                    node2.RightChildNodes = node1;
                else
                    node2.LeftChildNodes = node1;
            }

        }

        /// <summary>
        /// 插入树 给定节点
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual void InsetNode(T key)
        {
            TreeNode<T> node = new TreeNode<T>(key, null, null, null);
            InsetNode(this, node);
        }

        /// <summary>
        /// 删除节点(删)并返回删除的节点
        /// </summary>
        private TreeNode<T> RemoveNode(BinaryTree<T> tree, TreeNode<T> removeNode)
        {
            TreeNode<T> node = null;
            TreeNode<T> node1 = null;
            if (removeNode.LeftChildNodes == null || removeNode.RightChildNodes == null)
                node1 = removeNode;
            else
                node1 = FindSucceedNode(removeNode);

            if (node1.LeftChildNodes != null)
                node = node1.LeftChildNodes;
            else
                node = node1.LeftChildNodes;

            if (node != null)
                node.ParentNode = node1.ParentNode;

            if (node1.ParentNode == null)
            {
                tree.MRoot = node;
            }
            else if (node1 == node1.ParentNode.LeftChildNodes)
            {
                node1.ParentNode.LeftChildNodes = node;
            }
            else
            {
                node1.ParentNode.RightChildNodes = node;
            }
            if (node1 != removeNode)
                node1.MKey = removeNode.MKey;
            return node1;
        }

        /// <summary>
        /// 删除节点
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual void RemoveNode(T key)
        {
            TreeNode<T> findNode;
            if ((findNode = FindNode(key, MRoot)) != null)
            {
                TreeNode<T> removeNode = RemoveNode(this, findNode);
                // ReSharper disable once RedundantCheckBeforeAssignment
                if (removeNode != null)
                    removeNode = null;
            }
        }

        /// <summary>
        /// 销毁二叉树
        /// </summary>
        /// <param name="tree"></param>
        protected void DestroyNode(TreeNode<T> tree)
        {
            if (tree == null)
                return;
            if (tree.LeftChildNodes != null)
                DestroyNode(tree.LeftChildNodes);
            if (tree.RightChildNodes != null)
                DestroyNode(tree.RightChildNodes);

            tree = null;
        }

        public void DestroyNode()
        {
            DestroyNode(MRoot);
            MRoot = null;
        }

        /// <summary>
        /// 查找节点1(查)
        /// </summary>
        /// <param name="key"></param>
        /// <param name="treeNode"></param>
        /// <returns></returns>
        public TreeNode<T> FindNode(T key, TreeNode<T> treeNode)
        {
            if (treeNode == null)
            {
                return null;
            }

            int comparable = key.CompareTo(treeNode.MKey);
            if (comparable < 0)
            {
                return FindNode(key, treeNode.LeftChildNodes);
            }
            else if (comparable > 0)
            {
                return FindNode(key, treeNode.RightChildNodes);
            }
            else
            {
                return treeNode;
            }
        }

        /// <summary>
        /// 查找节点2(查)
        /// </summary>
        /// <param name="key"></param>
        /// <param name="treeNode"></param>
        /// <returns></returns>
        protected TreeNode<T> IterativeFindNode(T key, TreeNode<T> treeNode)
        {
            while (treeNode != null && key != null)
            {
                int comparable = key.CompareTo(treeNode.MKey);
                if (comparable > 0)
                {
                    treeNode = treeNode.RightChildNodes;
                }
                else if (comparable < 0)
                {
                    treeNode = treeNode.LeftChildNodes;
                }
            }
            return treeNode;
        }

        /// <summary>
        /// 查找节点
        /// </summary>
        /// <param name="key"></param>根据key
        /// <returns></returns>
        public virtual TreeNode<T> IterativeFindNode(T key)
        {
            return IterativeFindNode(key, MRoot);
        }

        /// <summary>
        /// 查找最大值
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        protected TreeNode<T> FindMaxNode(TreeNode<T> node)
        {
            if (node == null)
                return null;

            while (node.RightChildNodes != null)
            {
                node = node.RightChildNodes;
            }
            return node;
        }

        public T FindMax()
        {
            TreeNode<T> node = FindMaxNode(MRoot);
            if (node != null)
                return node.MKey;
            return default(T);
        }

        /// <summary>
        /// 查找最小值
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        protected TreeNode<T> FindMinNode(TreeNode<T> node)
        {
            if (node == null)
                return null;

            while (node.LeftChildNodes != null)
                node = node.LeftChildNodes;

            return node;
        }

        /// <summary>
        /// 查找最小值 根据key
        /// </summary>
        /// <returns></returns>
        public T FindMin()
        {
            TreeNode<T> node = FindMinNode(MRoot);
            if (node != null)
                return node.MKey;
            return default(T);
        }

        /// <summary>
        /// 寻找前驱
        /// </summary>前驱就是寻找小于该节点的最大节点
        /// <param name="node"></param>
        /// <returns></returns>
        ///          9   
        ///        /   \
        ///       5    12
        ///           /  \
        ///          10  25
        ///         /  \
        ///        8   20 
        ///       / \  
        ///      6  15
        /// 6的前驱节点是5  15的前驱节点是12    12的前驱节点是10
        public TreeNode<T> FindPrecursorNode(TreeNode<T> node)
        {
            if (node == null)
                return null;

            if (node.LeftChildNodes != null)
                return FindMaxNode(node.LeftChildNodes);
            TreeNode<T> parentNode = node.ParentNode;
            while (parentNode != null && parentNode.LeftChildNodes == node)
            {
                node = parentNode;
                parentNode = parentNode.ParentNode;
            }
            return parentNode;
        }


        /// <summary>
        /// 寻找后继
        /// </summary>后继就是寻找大于该节点的最小节点
        ///          9   
        ///        /   \
        ///       5    12
        ///           /  \
        ///          10  25
        ///         /  \
        ///        8   20 
        ///       / \  
        ///      6  15
        /// 6的后继节点是8  15的后继节点是20    12的后继节点是15
        /// <param name="node"></param>
        /// <returns></returns>
        public TreeNode<T> FindSucceedNode(TreeNode<T> node)
        {
            if (node == null)
                return null;
            if (node.RightChildNodes != null)
                return FindMinNode(node.RightChildNodes);

            TreeNode<T> parentNode = node.ParentNode;
            while (parentNode != null && parentNode.RightChildNodes == node)
            {
                node = parentNode;
                parentNode = node.ParentNode;
            }
            return parentNode;
        }


        /// <summary>
        /// 前序遍历
        /// 访问根节点
        /// 遍历左子树
        /// 遍历右子树
        /// </summary>
        protected virtual void PreorderBStree(TreeNode<T> tree)
        {
            if (tree != null)
            {
                Console.Write(tree.MKey + "\n");

                var tree1 = tree as AVLNode<T>;
                if (tree1 != null) Console.Write("high:" + tree1.Mhight + "\n");

                PreorderBStree(tree.LeftChildNodes);
                PreorderBStree(tree.RightChildNodes);
            }
        }

        /// <summary>
        /// 前序遍历
        /// </summary>
        public virtual void PreorderBStree()
        {
            PreorderBStree(MRoot);
        }

        /// <summary>
        /// 中序遍历
        /// 遍历左子树
        /// 访问根节点
        /// 遍历右子树
        /// </summary>
        protected virtual void InorderBStree(TreeNode<T> tree)
        {
            if (tree != null)
            {
                PreorderBStree(tree.LeftChildNodes);
                Console.Write(tree.MKey + "\n");

                var tree1 = tree as AVLNode<T>;
                if (tree1 != null) Console.Write("high:" + tree1.Mhight + "\n");

                PreorderBStree(tree.RightChildNodes);
            }
        }

        /// <summary>
        /// 中序遍历
        /// </summary>
        public virtual void InorderBStree()
        {
            InorderBStree(MRoot);
        }

        /// <summary>
        /// 后序遍历
        /// 遍历左子树
        /// 遍历右子树
        /// 访问根节点
        /// </summary>
        protected virtual void PostorderBStree(TreeNode<T> tree)
        {
            if (tree != null)
            {
                PreorderBStree(tree.LeftChildNodes);
                PreorderBStree(tree.RightChildNodes);
                Console.Write(tree.MKey + "\n");

                var tree1 = tree as AVLNode<T>;
                if (tree1 != null) Console.Write("high:" + tree1.Mhight + "\n");
            }
        }

        /// <summary>
        /// 后序遍历
        /// </summary>
        public virtual void PostorderBStree()
        {
            PostorderBStree(MRoot);
        }
    }
}

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SmillCool/article/details/86740885

智能推荐

springboot2.2整合spring-data-elasticsearch3.2_spring data elasticsearch health check close sprin-程序员宅基地

文章浏览阅读4k次。环境:Elasticsearch:7.4.1Springboot:2.2.1Spring-data-elasticsearch:3.2.0IDE:STS_3.9.2.RELEASEpom.xml配置<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0..._spring data elasticsearch health check close spring 3.2

图形化编程Mixly——RFID智能门禁_csdnrfidmixly-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏11次。文章目录1.软硬件连接2.图形化编程块3.代码块4.实验成果实验材料与环境1、硬件Arduino开发板、舵机SG90、RFID-RC522读卡器、校园卡、杜邦线若干2、软件Mixly IDE(下载地址:https://pan.baidu.com/s/1vKnY-vC4LU0qMFitArEXfw提取码:tbfe)实验内容【1】读取校园卡ID号。【2】读取到指定校园卡时S..._csdnrfidmixly

java/jsp/ssm基于web的多媒体素材管理系统【2024年毕设】_基于web的多媒体素材管理系统zip-程序员宅基地

文章浏览阅读53次。springboot基于Springboot的企业cms内容管理系统。springboot基于Vue和Springboot的会议室管理系统。开发软件:eclipse/myeclipse/idea。springboot中小型企业物流管理系统的设计与实现。springboot微信小程序的食谱大全“食全食美”springboot基于微信小程序的舟袍设计工作室。ssm基于web的佳茗天香茶品销售平台的设计与实现。springboot医考答题练习系统的设计与实现。springboot微信小程序的火锅店点餐系统。_基于web的多媒体素材管理系统zip

vue多种实现动画效果分享【推荐学习】_vue 动画-程序员宅基地

文章浏览阅读1k次。通常我们实现动画效果会用到CSS中的class类,这也是比较基本的方式实现动画。_vue 动画

免费送书!从ROS1到ROS2,无人机编程实战指南-程序员宅基地

文章浏览阅读340次。亲爱的读者们,我们今天非常荣幸地向大家推荐一本全新力作——《从ROS1到ROS2无人机编程实战指南》。这本书站在初学者的角度,从入门到进阶,再到实战,循序渐进,是学习ROS1和ROS2的最佳选择。如今已在全国范围内上市,购书即可享受次日达的快捷服务!本书的创作初衷源于帮助那些渴望投身于无人机或机器人开发的初学者。目前,国内关于ROS的书籍相当稀缺,大部分都是国外翻译版,内容可能更偏向于机器人学的公..._从ros1到ros2无人机编程实战指南

tkinter创建子窗口(只创建一个)_tkinter子窗口-程序员宅基地

文章浏览阅读635次。【代码】tkinter创建子窗口(只创建一个)_tkinter子窗口

随便推点

米家接入HomeKit系列二:通过群辉NAS的Docker搭建HomeAssistant_群晖接入米家-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏41次。通过前面的文章我们已经知道我们为什么要搭建HomeAssistant,那么本篇文章我们就来给大家讲解如何通过群辉NAS的Docker搭建HomeAssistant,以及其基本的配置和使用。_群晖接入米家

Windows 10下载安装openjdk及环境变量配置(以openjdk 8为例)_openjdk环境变量配置-程序员宅基地

文章浏览阅读9.2k次,点赞7次,收藏13次。Windows 10下载安装openjdk及环境变量配置(以openjdk 8为例)Windows 10下载安装openjdk及环境变量配置下载地址https://www.azul.com/downloads/zulu-community/?package=jdk安装双击已下载的安装包点击Next,安装目录可以自己定义点击Next进入安装界面进行安装安装完成后显示如下界面设置环境变量1.进入环境变量配置界面1.右键点击计算机–>属性–>高级系统设置–>高级_openjdk环境变量配置

PyTorch如何打印模型详细信息_python打印模型-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏15次。如何打印模型_python打印模型

维修Proface普洛菲斯触摸屏GP-4502WW 4301 4501TW 4401T人机界面-程序员宅基地

文章浏览阅读498次,点赞14次,收藏4次。伦茨、KEB、西门子、力士乐、施耐德电气、、鲍米勒、丹佛斯、派克、三菱、Allen Bradley、ABB、罗克韦尔、东芝、Gerfan、松下、Proface、台达、Beckhoff、Omron欧姆龙、Sumitomo住友、Sodick沙迪克、SedoTreepoint、WEINVIEW威纶通、Axiomtek艾讯、Portwell瑞传、Laetus.......等各大知名进口品牌工控机。W275 x H206 x D38.2 毫米 [W10.85 x H8.11 x D1.50 英寸]

Apipost 上手指南_apipost上传文件接口-程序员宅基地

文章浏览阅读4.3k次。Apipost是一个用于Web开发的接口调试工具,由国人开发。目前版本:7.0类似的产品还有,不过个人感觉功能上不如Apipost好用。_apipost上传文件接口

linux单机巡检脚本并发送邮箱的巡检报告-程序员宅基地

文章浏览阅读389次,点赞10次,收藏10次。案例,生成的巡检报告邮件。

推荐文章

热门文章

相关标签