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; }
}
}