.Net 中泛型二叉树的实现和中序遍历

来源:互联网 发布:美工基本知识 编辑:程序博客网 时间:2024/06/06 01:31

using System;
using System.Collections.Generic;
using System.Text;

namespace BinaryTree
{
    public class Tree<T> where T : IComparable<T>
    {
        #region 字段

        private T data;
        private Tree<T> left;
        private Tree<T> right;

        #endregion

        #region 属性

        /// <summary>
        ///  节点数据
        /// </summary>
        public T NodeData
        {
            get { return this.data; }
            set { this.data = value; }
        }
        /// <summary>
        /// 左子树
        /// </summary>
        public Tree<T> LeftTree
        {
            get { return this.left; }
            set { this.left = value; }
        }
        /// <summary>
        /// 右子树
        /// </summary>
        public Tree<T> RightTree
        {
            get { return right; }
            set { right = value; }
        }

        #endregion


        #region 方法

        /// <summary>
        /// 自定义构造函数
        /// </summary>
        /// <param name="nodeValue"></param>
        public Tree(T nodeValue)
        {
            this.data = nodeValue;
            this.left = null;
            this.right = null;
        }

        /// <summary>
        /// 将新项插入二叉树中
        /// </summary>
        /// <param name="newItem">新项</param>
        public void Insert(T newItem)
        {
            T currentNodeValue = this.NodeData;
            if (currentNodeValue.CompareTo(newItem) > 0)
            {
                // 在左子树中插入新项
                if (this.LeftTree == null)
                {
                    // 使用新项创建新的左子树
                    this.LeftTree = new Tree<T>(newItem);
                }
                else
                {
                    // 递归调用Insert方法,将新项插入现有左子树中
                    this.LeftTree.Insert(newItem);
                }
            }
            else
            {
                // 在右子树中插入新项
                if (this.RightTree == null)
                {
                    // 使用新项创建新的右子树
                    this.RightTree = new Tree<T>(newItem);
                }
                else
                {
                    // 递归调用Insert方法,将新项插入现有右子树中
                    this.RightTree.Insert(newItem);
                }
            }
        }

        /// <summary>
        /// 中序遍历二叉树
        /// </summary>
        public void WalkTree()
        {
            if (this.LeftTree != null)
            {
                // 遍历左子树
                this.LeftTree.WalkTree();
            }
            Console.WriteLine(this.NodeData.ToString());
            if (this.RightTree != null)
            {
                // 遍历右子树
                this.RightTree.WalkTree();
            }
        }

        #endregion
    }
}

 

 

测试:

 

 

 

using System;
using System.Collections.Generic;
using System.Text;

using BinaryTree;

namespace BinaryTreeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Tree<int> tree1 = new Tree<int>(10);
            tree1.Insert(5);
            tree1.Insert(11);
            tree1.Insert(5);
            tree1.Insert(-12);
            tree1.Insert(15);
            tree1.Insert(0);
            tree1.Insert(14);
            tree1.Insert(-8);
            tree1.Insert(10);
            tree1.Insert(8);
            tree1.Insert(8);
            tree1.WalkTree();

            Tree<string> tree2 = new Tree<string>("Hello");
            tree2.Insert("World");
            tree2.Insert("How");
            tree2.Insert("Are");
            tree2.Insert("You");
            tree2.Insert("Today");
            tree2.Insert("I");
            tree2.Insert("You");
            tree2.Insert("Are");
            tree2.Insert("Feeling");
            tree2.Insert("Well");
            tree2.WalkTree();

            string[] test = new string[3];
            test[0] = "hello";
            test[1] = "world";
            test[2] = "haha";
            Tree<string> temp = BuildTree<string>(test);
            temp.WalkTree();
            Tree<string> array = BuildTree<string>("hello", "world", "haha");
            array.WalkTree();
        }
        public static Tree<T> BuildTree<T>(params T[] data) where T : IComparable<T>
        {
            Tree<T> sortTree = new Tree<T>(data[0]);
            for (int i = 1; i < data.Length; i++)
            {
                sortTree.Insert(data[i]);
            }
            return sortTree;
        }
    }
}

原创粉丝点击