剑指offer-32.二叉搜索树与双向链表(191)

32.二叉搜索树与双向链表(191)
  • 题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

  • 思路:采用中序遍历树中的结点。对于当前结点,需要改变当前结点的 left 指向其前一个结点,让前一个结点的right 指向当前结点。

  • 代码:

    package _32.二叉搜索树与双向链表;
    
    import java.util.Stack;
    
    /**
     * 题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
     * 要求不能创建任何新的结点,只能调整树中结点指针的指向。
     * @author Administrator
     *
     */
    public class ConvertBSTtoLink {
    	/**
    	 * 采用中序遍历结点:对于每一个结点,需要更改前一个结点的right(后继结点),
    	 * 和当前结点的left(前驱结点)
    	 * @param pRootOfTree
    	 * @return
    	 */
        public static TreeNode Convert(TreeNode pRootOfTree) {
           if(pRootOfTree == null){
        	   return null;
           }
           
           Stack<TreeNode> stack = new Stack<>();
           //保存当前结点的前一个结点,以便给前一结点的 right赋值
           TreeNode pre = null;
           //中序遍历结点
           TreeNode cur = pRootOfTree;
           //保存链表的头结点
           TreeNode linkedHead = null;
           
           boolean firstFlag = true;
          
           while(!stack.isEmpty() || cur != null){
        	   while(cur != null){
        		   stack.push(cur);
        		   cur = cur.left;
        	   }
        	   if(cur == null){
        		   cur = stack.pop();
        		   if(firstFlag){
        			   linkedHead = cur;
        			   pre = cur;
        			   firstFlag = false;
        		   }
        		   else{
        			   pre.right = cur;
        			   cur.left = pre;
        			   pre = cur;
        		   }
        		   cur = cur.right;
        	   }
           }
           return linkedHead;
        }
        
        public static void main(String[] args) {
        	  //          10
            //          /   \
            //         6     14
            //       /  \   / \
            //      4    8 12  16
            TreeNode root = new TreeNode(10);
            root.left = new TreeNode(6);
            root.right = new TreeNode(14);
            root.left.left = new TreeNode(4);
            root.left.right = new TreeNode(8);
            root.right.left = new TreeNode(12);
            root.right.right = new TreeNode(16);
            TreeNode result = Convert(root);
            while(result != null){
            	 System.out.println(result);
            	 result = result.right;
            }
    	}
    }
    class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
        }
    
    	@Override
    	public String toString() {
    		return "TreeNode [val=" + val + "]";
    	}
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值