题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:之前做个一个二叉搜索树的题目,了解了二叉搜索树的特点,即左子树小于节点,右子树大于节点,所以这个题目的大概意思就是中序遍历二叉搜索树,并且搞成双向链表(互相对应的),之前学数据结构的时候,对这些都是很熟悉的,代码也都会写,过去一年,现在都忘记了,所以对于这个题目,我想了很久,并且看了别人的解决方式,当然总体思路还是参用递归的,只是要想清楚怎么递归,代码大概的思路如下:
1、先遍历左子树
2、找到最底层的左子树,并构造双链表
3、将目前的根节点追加到左子树后面。
4、将右子树构建双链表,
5、将右子树节点追加到根节点后面。
emmm,说实话,感觉蛮难理解的。可以看代码模拟一遍过去就懂了
代码:
java:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null){
return pRootOfTree;
}
TreeNode root=Convert(pRootOfTree.left);
TreeNode p=root;
while(p!=null&&p.right!=null){
p=p.right;
}
if(p!=null){
p.right=pRootOfTree;
pRootOfTree.left=p;
}
TreeNode root1=Convert(pRootOfTree.right);
if(root1!=null){
pRootOfTree.right=root1;
root1.left=pRootOfTree;
}
return root!=null?root:pRootOfTree;
}
}
js:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Convert(root)
{
if(root==null)
return null;
if(root.left==null&&root.right==null)
return root;
var left1=Convert(root.left);
var p=left1;
while(p!=null&&p.right!=null){
p=p.right;
}
if(p!=null){
p.right=root;
root.left=p;
}
var right1=Convert(root.right);
if(right1!=null){
root.right=right1;
right1.left=root;
}
return left1!=null?left1:root;
// write code here
}