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

来源:互联网 发布:php开发mac应用 编辑:程序博客网 时间:2024/04/30 12:54

题目描述

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

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

递归实现,每次用一个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);    }}

1 0
原创粉丝点击