二叉搜索树与双向链表(java版)

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:

     对于二叉搜索树,用中序搜索算法挺适合。考虑每个子树子节点作为三部分,这里以根结点为特殊例子进行阐述

递归实现,每次用一个lastNode存放上一个子树的最后一个结点,该结点是上个已排好子树的最大的结点。
因此此时对于结点10来说,只需要建立与8之间的联系。
代码如下: 
<span style="font-size:14px;">public TreeNode Convert(TreeNode pRootOfTree) {
	       //按照中序遍历的方式递归
		   TreeNode p=pRootOfTree;
		   TreeNode lastNode=null;
		   MiddleFind(p,lastNode);
		   //lastNode现在指向了最后的结点
		   while(lastNode!=null&&lastNode.left!=null){
			   lastNode=lastNode.left;
		   }
		   
		   return lastNode;
	    }
	
    public void MiddleFind(TreeNode p,TreeNode LastNode) {
		if(p==null) return;

		MiddleFind(p.left,LastNode);
		//对每个结点类似中序进行操作,每次只管左边的两个链
		 p.left=lastNode;
		 if(lastNode!=null)
			  lastNode.right=p;
		lastNode=p;
		MiddleFind(p.right,LastNode);
		
	}</span>
这样不知道为嘛lastNode的值传不过来,java 中对象的传递不是传地址,形参变化会影响实参么,感觉有点奇怪,于是改动了下
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}
*/
public class Solution {
     TreeNode lastNode=null;//指向上一个子树的,设为全局的(奇怪,java中对象也是引用呀)
    public TreeNode Convert(TreeNode pRootOfTree) {
      //按照中序遍历的方式递归
		   TreeNode p=pRootOfTree;
		 // TreeNode lastNode=null;
		   MiddleFind(p);
		   //lastNode现在指向了最后的结点
		   while(lastNode!=null&&lastNode.left!=null){
			   lastNode=lastNode.left;
		   }
		   
		   return lastNode;
	    }
	
    public void MiddleFind(TreeNode p) {
		if(p==null) return;
		MiddleFind(p.left);
		//对每个结点类似中序进行操作,每次只管左边的两个链
		 p.left=lastNode;
		 if(lastNode!=null)
			  lastNode.right=p;
		lastNode=p;
		MiddleFind(p.right);
    }
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值