《剑指offer》——二叉搜索树与双向链表

60 篇文章 3 订阅

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

T:

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

这道题目,解决思路不难,类似于先序遍历,只不过要在压栈和出栈的过程中,把树的结构变为一个双向链表。

一张图解释用栈的解题思路:

这里写图片描述

详细说明都在代码注释当中.

code:

    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    
    import java.util.Stack;
    
    /**
     * T: 二叉搜索树与双向链表
     * 
     * 题目描述 
     * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
     * 要求不能创建任何新的结点,只能调整树中结点指针的指向。
     * 
     * date: 2015.12.3  19:54
     * @author SSS
     *
     */
    public class Solution {
        
        // 全局变量,设置一个栈,用于存放节点
    	Stack<TreeNode> nodeStack = new Stack<TreeNode>();
        
        public TreeNode Convert(TreeNode pRootOfTree) {
            if (pRootOfTree == null) {
    			return pRootOfTree;
    		}
            
            // 找到头结点,即最左边的节点
            TreeNode headNode = new TreeNode(0);
            
            this.pushStack(pRootOfTree);
            
            // 找到头结点
            headNode.right = nodeStack.peek();
            // preNode为当前的指针节点,指向当前最前端的节点
            TreeNode preNode = headNode;
            
            // 每次弹出一个元素,首先进行双链接,然后看该节点是否有右子树
            // 有的话,把右子树也添加进去
            while (!nodeStack.isEmpty()) {
            	TreeNode tempNode = nodeStack.pop();
            	// 弹出一个元素,就要进行一次双向链接
            	preNode.right = tempNode;
            	tempNode.left = preNode;
            	preNode = tempNode;
            	
            	// 如果右侧不为null,说明该节点还有右子树
    			if (tempNode.right != null) {
    				this.pushStack(tempNode.right);
    			}
    		}
            // 与虚设的节点断绝关联
            headNode.right.left = null;
            
            return headNode.right;
        }
        
        /**
    	 * 函数功能:将参数节点所有的左节点递归地压入栈
    	 * @param elementNode
    	 */
    	public void pushStack(TreeNode elementNode) {
    		TreeNode tempNode = new TreeNode(0);
    		tempNode = elementNode;
    		while (tempNode != null) {
    			nodeStack.add(tempNode);
    			tempNode = tempNode.left;
    		}
    	}
    }

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值