zoukankan      html  css  js  c++  java
  • 伸展二叉树树(C#)

    参考过好几篇关于将伸展树的代码,发现看不懂。看图能看懂原理。就尝试自己实现了下。

    自顶向上的算法。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Threading;
    using System.IO;
    using System.Collections;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        public class Program
        {
            public static void Main()
            {
                SplayTree<int> tree = new SplayTree<int>();
                tree.Insert(4);
                tree.Insert(2);
                tree.Insert(6);
                tree.Insert(1);
                tree.Insert(3);
                tree.Insert(5);
                tree.Insert(7);
    
                tree.Search(1);
    
                Console.Read();
            }
        }
    
        public class SplayTreeNode<T> where T : IComparable
        {
            public T Key { get; set; }
            public SplayTreeNode<T> LeftNode { get; set; }
            public SplayTreeNode<T> RightNode { get; set; }
            public SplayTreeNode(T _key, SplayTreeNode<T> _leftNode, SplayTreeNode<T> _rightNode)
            {
                this.Key = _key;
                this.LeftNode = _leftNode;
                this.RightNode = _rightNode;
            }
    
            public SplayTreeNode()
            { 
                
            }
    
            public override string ToString()
            {
                return Key + "";
            }
        }
    
        public class SplayTree<T> where T : IComparable
        {
            public SplayTreeNode<T> RootNode { get; set; }
    
            public void Splay(T key)
            {
                RootNode = Splay(RootNode, key);
            }
    
            public SplayTreeNode<T> Splay(SplayTreeNode<T> node, T key)
            {
                if (node == null)
                {
                    return node;
                }
    
                return null;
            }
    
            public void Insert(T key)
            {
                var node = RootNode;
                if (node == null)
                {
                    RootNode = new SplayTreeNode<T>(key, null, null);
                    return;
                }
    
                while (true)
                {
                    int result = node.Key.CompareTo(key);
                    if (result > 0)
                    {
                        if (node.LeftNode == null)
                        {
                            node.LeftNode = new SplayTreeNode<T>(key, null, null);
                        }
                        node = node.LeftNode;
                    }
                    else if (result < 0)
                    {
                        if (node.RightNode == null)
                        {
                            node.RightNode = new SplayTreeNode<T>(key, null, null);
                        }
                        node = node.RightNode;
                    }
                    else
                    {
                        break;
                    }
                }
            }
    
            public SplayTreeNode<T> Search(T key)
            {
                Search(RootNode, key);
                return  RootNode;
            }
    
            private void Search(SplayTreeNode<T> node, T key)
            {
                int result = node.Key.CompareTo(key);
                if (result < 0)
                {
                    node= RightRotation(node);
                    if (node.RightNode != null)
                    {
                        RootNode = node;
                    }
                    else
                    {
                        Search(node, key);
                    }
                    
                }
                else if (result > 0)
                {
                    node = LeftRotation(node);
                    if (node.LeftNode != null)
                    {
                        RootNode = node;
                    }else
                    {
                        Search(node, key);
                    }
                }
                else
                {
                    RootNode = node;
                }
            }
    
            private SplayTreeNode<T> LeftRotation(SplayTreeNode<T> node)
            {
                SplayTreeNode<T> temp = node.LeftNode;
                node.LeftNode = temp.RightNode;
                temp.RightNode = node;
                return temp;
            }
    
            private SplayTreeNode<T> RightRotation(SplayTreeNode<T> node)
            {
                SplayTreeNode<T> temp = node.RightNode;
                node.RightNode = temp.LeftNode;
                temp.LeftNode = node;
                return temp;
            }
        }
    }
  • 相关阅读:
    清除/var/spool/clientmqueue/目录下的文件
    欧几里德法求最大公约数
    博客园美化
    Vue.js学习笔记-script标签在head和body的区别
    C++ 继承
    Ubuntu 更换软件源/镜像源
    12306火车票余票查询&Python实现邮件发送
    饥荒联机代码
    linux内核编程入门 hello world
    windows环境下使用C++&Socket实现文件传输
  • 原文地址:https://www.cnblogs.com/bbvi/p/5148564.html
Copyright © 2011-2022 走看看