码迷,mamicode.com
首页 > 其他好文 > 详细

二叉搜索树与双向链表

时间:2017-08-22 16:13:59      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:article   顺序   about   highlight   tail   data-   views   last   treenode   

http://blog.csdn.net/qq_27703417/article/details/70980063

 

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

技术分享

思路:

方法一:关键是理解题目要求的意思。将二叉搜索树转变为排序的双向链表,首先链表中的结点要是有序的,然后各个结点之间要双向连接,显然对于搜索二叉树,必须进行中序遍历才可能将结点顺序排列,于是问题的解决办法就是对于二叉树进行中序遍历,在遍历的同时调整结点之间的指针,使之成为双向链表。

遍历时总是保留上一个结点lastNode,每遍历一个结点node,设置node.left=lastNode,并且设置lastNode.right=last;即总是将上一个结点的right赋值为当前结点,将当前结点的left赋值为上一个结点。于是使用left指针可以指向上一个结点,使用right指针可以指向下一个结点。初始时令lastNode=null,对于lastNode=null时,不需要设置lastNode.right=node.对于最后一个结点,当node=null时,不用设置node.left=lastNode,即在遍历中间结点时条件2个if条件即可。最后返回是新的双向链表的头结点,只需要在开始遍历第一个结点的时候,即lastNode==null的时候将当前的root结点赋值给成员变量head即可波流这个头结点,最后返回头结点即可。注意常识:head=root之后, head仅仅是一个符号,是一个指针而已,它指向的是一个具体的对象,这个对象所在的结点就存在与堆中,于是使用head就可以找到头结点对象。

同理, root.left=lastNode中,将当前的前一个结点lastNode赋值给了root.left,但是之后lastNode=root显然lastNode的值发生了变化,那么是否之前的root.left也会发生变化呢?其实不会,要注意,root.left=lastNode中lastNode在赋值运算的右边,而lastNode仅仅是一个符号,是一个指针,它指向的是一个堆中的地址,于是将root.left也引向这个地址对象后lastNode这个指针就失效了,之后再对lastNode附上新的值只是将lastNode的指针指向了新的地址,并不会影响root.left指向的具体的对象。因此,思考问题要从指针的角度来思考问题,其实Java指针和我感觉中的用法是一致的,可以按着感觉走。

 

[java] view plain copy
 
 print?
  1. public class Solution {  
  2.     TreeNode lastNode=null;  
  3.     TreeNode head;  
  4.     public TreeNode Convert(TreeNode pRootOfTree) {  
  5.         //特殊输入  
  6.         if(pRootOfTree==null) return null;  
  7.         //调用递归方法解决问题  
  8.         this.process(pRootOfTree);  
  9.         return head;  
  10.     }  
  11.       
  12.     //递归方法,中序遍历  
  13.     private void process(TreeNode root){  
  14.         //边界条件  
  15.         if(root==null) return;  
  16.         //①先遍历左子树  
  17.         this.process(root.left);  
  18.         //②遍历当前中间结点  
  19.         if(lastNode!=null){  
  20.             lastNode.right=root;  
  21.         }else{  
  22.             head=root;  
  23.         }  
  24.         if(root!=null){  
  25.             root.left=lastNode;  
  26.         }  
  27.         //更新lastNoode  
  28.         lastNode=root;  
  29.         //③遍历右子树  
  30.         this.process(root.right);  
  31.     }  
  32. }  

二叉搜索树与双向链表

标签:article   顺序   about   highlight   tail   data-   views   last   treenode   

原文地址:http://www.cnblogs.com/joshsung/p/7411631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!