数据结构刷题java——将二叉搜索树转化成有序双向链表
[题目链接](二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com))
因为是二叉搜索树,所以使用中序遍历就可以将二叉树转变为有序的。
同时,二叉树和链表相同,都是有3个节点:一个数值域,两个指针域
综上两条性质,可以在中序遍历的时候改变二叉树左右指向,使它变为双向链表
这个题真的是太妙了,就是从分利用了二叉搜索树和中序遍历
具体的解释在代码注释中:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode prev=null;
public void Inoreder(TreeNode root){
if(root==null) return;
//中序遍历之左子树遍历
Inoreder(root.left);
//中序遍历之操作:改变节点的指向
//第一次root.left指向的prev是null,后来的prev
//是保存的前一次的中序遍历的值,正好使整个链表有序
root.left=prev;
//如果使非空的节点,因为使双向链表,所以prev和root要链接起来
if(prev!=null)
prev.right=root;
//保存当前的根节点,好返回给上一层
prev=root;
Inoreder(root.right);
}
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null) return null;
Inoreder(pRootOfTree);
//找到头节点,对于二叉搜索树来说,
//一直找左节点直到左节点是空为止
TreeNode node=pRootOfTree;
while(node.left!=null){
node=node.left;
}
return node;
}
}