[剑指offer]26.二叉搜索树与双向链表

二叉搜索树与双向链表

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

** 解题思路 **
先明确二叉搜索树的性质:父节点的值大于其左孩子的值,小于其右孩子,中序遍历二叉搜索树可以得到一个非递减的有序序列。由此可以知道,将一个树中的节点转换为链表时,其前序节点可能为:

  1. 左子树
  2. 左子树的右子树

其后续节点可能为:

  1. 右子树
  2. 右子树的左子树

** 代码实现**

public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
        	return null;
        }

        Tree2List(pRootOfTree);// 调整至双联表结构
        TreeNode listHead = pRootOfTree;
        for (;listHead.left != null; listHead = listHead.left);
        return listHead;
    }

    public void Tree2List(TreeNode p) {
    	if (p == null) {
    		return;
    	}

    	if (p.left == null && p.right == null) {// 若为叶子节点
    		return;
    	}
    	else {//非叶子节点
    		if (p.left != null) {// 有左子树
    			Tree2List(p.left);
    			if(p.left.right == null){ // 其左子树无右子树
    				p.left.right = p;
    			}   	
    			else { // 其左子树有右子树
    				TreeNode q = p.left;
    				p.left = q.right;
    				q.right.right = p;
    			}		
    		}
    		if (p.right != null) { //若有右子树
    			Tree2List(p.right);
    			if(p.right.left == null) { //若其右子树无左子树
    				p.right.left = p;
    			}
    			else { //若其右子树有左子树
    				TreeNode q = p.right;
    				p.right = q.left;
    				q.left.left = p;
    			}
    		}
    	}
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值