• 二叉树查找(C#)


    参考文章:

    http://www.cnblogs.com/huangxincheng/archive/2012/07/21/2602375.html

    http://www.cnblogs.com/xiashengwang/archive/2013/03/04/2942555.html

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Threading;
    using System.IO;
    using System.Collections;
    
    namespace ConsoleApplication2
    {
        public class Program
        {
            public static void Main()
            {
                BinaryTree<int, Student> binaryTree = new BinaryTree<int, Student>();
                binaryTree.Add(30, new Student() { Age = 30, Name = "30", Sex = false });//这个是用Age作为key
                binaryTree.Add(25, new Student() { Age = 25, Name = "25", Sex = false });
                binaryTree.Add(19, new Student() { Age = 19, Name = "19", Sex = true });
                binaryTree.Add(37, new Student() { Age = 37, Name = "37", Sex = false });
                binaryTree.Add(35, new Student() { Age = 35, Name = "35", Sex = true });
                binaryTree.Add(40, new Student() { Age = 40, Name = "40", Sex = false });
                binaryTree.Add(39, new Student() { Age = 39, Name = "39", Sex = true });
                binaryTree.Add(34, new Student() { Age = 34, Name = "34", Sex = true });
                binaryTree.Add(32, new Student() { Age = 32, Name = "32", Sex = false });
                binaryTree.Add(38, new Student() { Age = 38, Name = "38", Sex = true });
                binaryTree.Add(22, new Student() { Age = 22, Name = "22", Sex = true });
                binaryTree.Add(42, new Student() { Age = 42, Name = "42", Sex = true });
                binaryTree.Add(38, new Student() { Age = 38, Name = "38@", Sex = true });//注意哦 这里故意又出现个38
                binaryTree.Add(36, new Student() { Age = 36, Name = "36", Sex = false });
    
    
                Console.WriteLine("层排序遍历:");
                LevelOrder(binaryTree.RootNote);
                Console.WriteLine();
    
                Console.WriteLine("是否含有指定元素");
                Console.WriteLine(binaryTree.Contain(39));
                Console.WriteLine();
    
                Console.WriteLine("最小元素");
                Console.WriteLine(binaryTree.FindMin().TreeKey);
                Console.WriteLine();
    
                Console.WriteLine("最大元素");
                Console.WriteLine(binaryTree.FindMax().TreeKey);
                Console.WriteLine();
    
                Console.WriteLine("范围查找");
                foreach (var item in binaryTree.SearchRange(25, 35))
                {
                    Console.WriteLine(item.Age);
                }
                Console.WriteLine();
    
                Console.WriteLine("删除指定元素");
                binaryTree.Remove(37, new Student() { Age = 37, Name = "37", Sex = false  });
                Console.WriteLine();
    
                Console.WriteLine("层排序遍历:");
                LevelOrder(binaryTree.RootNote);
                Console.WriteLine();
    
                Console.WriteLine("前序遍历:");
                PreOrder(binaryTree.RootNote);
                Console.WriteLine();
    
                Console.WriteLine("中序遍历:");
                InOrder(binaryTree.RootNote);
                Console.WriteLine();
    
                Console.WriteLine("后序遍历:");
                PostOrder(binaryTree.RootNote);
                Console.WriteLine();
    
                Console.Read();
            }
    
            private static void PreOrder(TreeNote<int, Student> treeNote)
            {
                foreach (var item in treeNote.TreeValues)
                {
                    Console.Write(item.Name + " ");
                }
    
                if (treeNote.LeftTreeNote != null)
                {
                    PreOrder(treeNote.LeftTreeNote);
                }
    
                if (treeNote.RightTreeNote != null)
                {
                    PreOrder(treeNote.RightTreeNote);
                }
            }
    
            private static void InOrder(TreeNote<int, Student> treeNote)
            {
                if (treeNote.LeftTreeNote != null)
                {
                    InOrder(treeNote.LeftTreeNote);
                }
    
                foreach (var item in treeNote.TreeValues)
                {
                    Console.Write(item.Name + " ");
                }
    
                if (treeNote.RightTreeNote != null)
                {
                    InOrder(treeNote.RightTreeNote);
                }
            }
    
            private static void PostOrder(TreeNote<int, Student> treeNote)
            {
                if (treeNote.LeftTreeNote != null)
                {
                    PostOrder(treeNote.LeftTreeNote);
                }
    
                if (treeNote.RightTreeNote != null)
                {
                    PostOrder(treeNote.RightTreeNote);
                }
    
                foreach (var item in treeNote.TreeValues)
                {
                    Console.Write(item.Name + " ");
                }
            }
    
            private static void LevelOrder(TreeNote<int, Student> treeNote)
            {
                Queue queue = new Queue();
                queue.Enqueue(treeNote);
                while (queue.Count > 0)
                {
                    var treeNoteTemp = (TreeNote<int, Student>)queue.Dequeue();
    
                    foreach (var item in treeNoteTemp.TreeValues)
                    {
                        Console.Write(item.Name + " ");
                    }
    
                    if (treeNoteTemp.LeftTreeNote != null)
                    {
                        queue.Enqueue(treeNoteTemp.LeftTreeNote);
                    }
    
                    if (treeNoteTemp.RightTreeNote != null)
                    {
                        queue.Enqueue(treeNoteTemp.RightTreeNote);
                    }
                }
            }
        }
    
        public class Student : IEquatable<Student>//由于后面代码的treeNote.TreeValues.Remove(treeValue);  因为HashCode不同无法删除 这里需要重写GetHashCode()
        {
            public string Name { get; set; }
            public bool Sex { get; set; }
            public int Age { get; set; }
    
            public bool Equals(Student other)
            {
                return this.Name == other.Name &&
                    this.Sex == other.Sex &&
                    this.Age == other.Age;
            }
            public override bool Equals(object obj)
            {
                if (obj == null) return base.Equals(obj);
    
                if (obj is Student)
                    return Equals(obj as Student);
                else
                    throw new InvalidCastException("the 'obj' Argument is not a Student object");
            }
            public override int GetHashCode()
            {
                return Name.GetHashCode()^Sex.GetHashCode()^Age.GetHashCode();//return object's hashcode
            }
        }
    
    
        public class TreeNote<TKey, TValue> where TKey : IComparable
        {
            public TreeNote(TKey treeKey, TValue treeValue)
            {
                TreeKey = treeKey;
                TreeValues = new HashSet<TValue>();
                TreeValues.Add(treeValue);
            }
    
            public TKey TreeKey { get; set; }
            public HashSet<TValue> TreeValues { get; set; }
            public TreeNote<TKey, TValue> LeftTreeNote { get; set; }
            public TreeNote<TKey, TValue> RightTreeNote { get; set; }
        }
    
        public class BinaryTree<TKey, TValue> where TKey : IComparable
        {
            public TreeNote<TKey, TValue> RootNote = null;//根节点
    
            public void Add(TKey treeKey, TValue treeValue)
            {
                RootNote = Add(treeKey, treeValue, RootNote);
            }
    
            private TreeNote<TKey, TValue> Add(TKey treeKey, TValue treeValue, TreeNote<TKey, TValue> treeNote)
            {
                if (treeNote == null)
                {
                    return new TreeNote<TKey, TValue>(treeKey, treeValue);
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) > 0)
                {
                    treeNote.LeftTreeNote = Add(treeKey, treeValue, treeNote.LeftTreeNote);
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) < 0)
                {
                    treeNote.RightTreeNote = Add(treeKey, treeValue, treeNote.RightTreeNote);
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) == 0)
                {
                    treeNote.TreeValues.Add(treeValue);
                }
    
                return treeNote;
            }
    
            public bool Contain(TKey treeKey)
            {
                return Contain(treeKey, RootNote);
            }
    
            private bool Contain(TKey treeKey, TreeNote<TKey, TValue> treeNote)
            {
                if (treeNote == null)
                {
                    return false;
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) > 0)
                {
                    return Contain(treeKey, treeNote.LeftTreeNote);
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) < 0)
                {
                    return Contain(treeKey, treeNote.RightTreeNote);
                }
    
                return treeNote.TreeKey.CompareTo(treeKey) == 0;
            }
    
            public HashSet<TValue> SearchRange(TKey minTreeKey, TKey maxTreeKey)
            {
                return SearchRange(minTreeKey, maxTreeKey, RootNote, new HashSet<TValue>());
            }
    
            private HashSet<TValue> SearchRange(TKey minTreeKey, TKey maxTreeKey, TreeNote<TKey, TValue> treeNote, HashSet<TValue> attach)
            {
                if (treeNote == null)
                {
                    return attach;
                }
    
                if (treeNote.TreeKey.CompareTo(minTreeKey) > 0)
                {
                    SearchRange(minTreeKey, maxTreeKey, treeNote.LeftTreeNote, attach);
                }
    
                if (treeNote.TreeKey.CompareTo(minTreeKey) >= 0 && treeNote.TreeKey.CompareTo(maxTreeKey) <= 0)
                {
                    foreach (var item in treeNote.TreeValues)
                    {
                        attach.Add(item);
                    }
                }
    
                if (treeNote.TreeKey.CompareTo(maxTreeKey) < 0)
                {
                    SearchRange(minTreeKey, maxTreeKey, treeNote.RightTreeNote, attach);
                }
    
                return attach;
            }
    
            public TreeNote<TKey, TValue> FindMin()
            {
                return FindMin(RootNote);
            }
    
            private TreeNote<TKey, TValue> FindMin(TreeNote<TKey, TValue> treeNote)
            {
                if (treeNote == null)
                {
                    return null;
                }
    
                if (treeNote.LeftTreeNote == null)
                {
                    return treeNote;
                }
                else
                {
                    return FindMin(treeNote.LeftTreeNote);
                }
            }
    
            public TreeNote<TKey, TValue> FindMax()
            {
                return FindMax(RootNote);
            }
    
            private TreeNote<TKey, TValue> FindMax(TreeNote<TKey, TValue> treeNote)
            {
                if (treeNote == null)
                {
                    return null;
                }
    
                if (treeNote.RightTreeNote == null)
                {
                    return treeNote;
                }
                else
                {
                    return FindMax(treeNote.RightTreeNote);
                }
            }
    
            public void Remove(TKey treeKey, TValue treeValue)
            {
                Remove(treeKey, treeValue, RootNote, true);
            }
    
            private TreeNote<TKey, TValue> Remove(TKey treeKey, TValue treeValue, TreeNote<TKey, TValue> treeNote, bool isAccordingToTreeValues)
            {
                if (treeNote == null)
                {
                    return null;
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) > 0)
                {
                    treeNote.LeftTreeNote = Remove(treeKey, treeValue, treeNote.LeftTreeNote, isAccordingToTreeValues);
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) < 0)
                {
                    treeNote.RightTreeNote = Remove(treeKey, treeValue, treeNote.RightTreeNote, isAccordingToTreeValues);
                }
    
                if (treeNote.TreeKey.CompareTo(treeKey) == 0)
                {
                    if (treeNote.TreeValues.Count > 1 && isAccordingToTreeValues)
                    {
                        treeNote.TreeValues.Remove(treeValue);
                    }
                    else
                    {
                        if (treeNote.LeftTreeNote == null || treeNote.RightTreeNote == null)
                        {
                            treeNote = treeNote.LeftTreeNote == null ? treeNote.RightTreeNote : treeNote.LeftTreeNote;
                        }
                        else //有一对子元素
                        {
                            var treeNoteTemp = FindMin(treeNote.RightTreeNote);//右子节点下的最小子节点替换当前节点
                            treeNote.TreeKey = treeNoteTemp.TreeKey;
                            treeNote.TreeValues = treeNoteTemp.TreeValues;
    
                            treeNote.RightTreeNote = Remove(treeNoteTemp.TreeKey, treeValue, treeNote.RightTreeNote, false);
                        }
                    }
                }
                return treeNote;
            }
        }
    }
  • 相关阅读:
    iOS--推送
    iOS 多线程之GCD
    iOS多线程之NSThread
    NSUserDefaults的简单使用
    stat命令的实现-mystat
    linux pwd指令的C实现
    2019-2020-1 20175307 20175308 20175319 实验五 通讯协议设计
    2019-2020-1 20175307 20175308 20175319 实验四 外设驱动程序设计
    2019-2020-1 20175307 20175308 20175319 实验三 并发程序
    2019-2020-1 20175307 20175308 20175319 实验二 固件程序设计
  • 原文地址:https://www.cnblogs.com/bbvi/p/5049082.html
Copyright © 2020-2023  润新知