要求
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 1:
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
示例 2:
输入:root = [5,1,7]
输出:[1,null,5,null,7]
提示:
树中节点数的取值范围是 [1, 100]
0 <= Node.val <= 1000
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication9
{
class Program
{
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null)
{
this.val = val;
this.left = left;
this.right = right;
}
}
public class Solution
{
private TreeNode resNode;
public TreeNode IncreasingBST(TreeNode root)
{
TreeNode dummyNode = new TreeNode(-1);
resNode = dummyNode;
inorder(root);
return dummyNode.right;
}
public void inorder(TreeNode node)
{
if (node == null)
{
return;
}
inorder(node.left);
// 在中序遍历的过程中修改节点指向
resNode.right = node;
node.left = null;
resNode = node;
inorder(node.right);
}
}
static void Main(string[] args)
{
Solution sl = new Solution();
TreeNode a1 = new TreeNode(1);
TreeNode a7 = new TreeNode(7);
TreeNode a5 = new TreeNode(5,a1,a7);
TreeNode re = sl.IncreasingBST(a5);
Console.WriteLine(re.val + " " + re.right.val + " " + re.right.right.val);
Console.ReadKey();
}
}
}
思路
- 因为只有右孩子,所以 node.left = null
- 考虑递归,先左查找,当左边为null的时候return 回到上一个,把上一个的复制到结果链表的右孩子中,然后指向这个节点 然后回到上一层,然后再右查找 正好符合中序遍历的左中右的风格