把二元查找树转变成排序的双向链表

1.把二元查找树转变成排序的双向链表
 题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
   
  10
  / /
 6 14
 / / / /
4 8 12 16
   
 转换成双向链表
4=6=8=10=12=14=16。

 

C# codes as below:

 

using System;

 

namespace ConsoleApp

{

    class RunClass

    {

        static void Main()

        {

            Node<int> i1 = new Node<int>() { Value = 4 };

            Node<int> i2 = new Node<int>() { Value = 8 };

            Node<int> i3 = new Node<int>() { Value = 12 };

            Node<int> i4 = new Node<int>() { Value = 16 };

            Node<int> i5 = new Node<int>() { Value = 6, Left = i1, Right = i2 };

            Node<int> i6 = new Node<int>() { Value = 14, Left = i3, Right = i4 };

            Node<int> i7 = new Node<int>() { Value = 10, Left = i5, Right = i6 };

 

            Tree<int> myTree = new Tree<int>() { Root = i7 };

            Link<int> myLink = new Helper<int>().Transfer(myTree);

 

            Node<int> current = myLink.Start;

            Console.WriteLine(current.Value);

 

            while (current.Right != null)

            {

                current = current.Right;

                Console.WriteLine(current.Value);

            }

 

            Console.ReadKey();

        }

    }

 

    class Helper<T>

    {

        public Link<T> Transfer(Tree<T> tree)

        {

         

            Node<T> root = tree.Root;

 

            if (root.Left != null)

            {

                Link<T> leftLink = Transfer(new Tree<T>() { Root = root.Left });

 

                Node<T> leftNode = leftLink.Start;

                while (leftNode.Right != null)

                {

                    leftNode = leftNode.Right;

                }

 

                root.Left = leftNode;

                leftNode.Right = root;

            }

 

            if (root.Right != null)

            {

                Link<T> rightLink = Transfer(new Tree<T>() { Root = root.Right });

 

                Node<T> rightNode = rightLink.Start;

 

                root.Right = rightNode;

                rightNode.Left = root;

            }

           

            Node<T> start=root;

            while(start.Left!=null)

            {

                start=start.Left;

            }

 

            return new Link<T>() { Start = start };

        }

    }

 

    class Node<T>

    {

        public Node<T> Left { get; set; }

        public Node<T> Right { get; set; }

 

        public T Value { get; set; }

    }

 

    class Tree<T>

    {

        public Node<T> Root { get; set; }

    }

 

    class Link<T>

    {

        public Node<T> Start { get; set; }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值