二叉树的搜索

本文详细介绍了如何通过中序遍历验证一个二叉树是否为二叉搜索树,并利用中序遍历将二叉搜索树转换为有序双向链表。在转换过程中,利用递归实现中序遍历,构建节点间的前后引用关系,最终形成循环链表。此外,还探讨了链表的特殊处理,如头尾节点的连接。
摘要由CSDN通过智能技术生成

1.中序遍历
中序遍历是二叉树的一种遍历方式,它先遍历左子树,再遍历根节点,最后遍历右子树。而我们二叉搜索树保证了左子树的节点的值均小于根节点的值,根节点的值均小于右子树的值,因此中序遍历以后得到的序列一定是升序序列(递增序列)

class Solution {
    public boolean isValidBST(TreeNode root) {
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        double inorder = -Double.MAX_VALUE;

        while (!stack.isEmpty() || root != null) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
              // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
            if (root.val <= inorder) {
                return false;
            }
            inorder = root.val;
            root = root.right;
        }
        return true;
    }
}
  1. 二叉搜索树与双向链表
    排序链表: 节点应从小到大排序,因此应使用 中序遍历 “从小到大”访问树的节点。
    双向链表: 在构建相邻节点的引用关系时,设前驱节点 pre 和当前节点 cur ,不仅应构建 pre.right = cur ,也应 构建 cur.left = pre
    循环链表: 设链表头节点 head 和尾节点 tail ,则应构建 head.left = tail 和 tail.right = head 。

在这里插入图片描述

dfs(cur): 递归法中序遍历;
终止条件: 当节点 cur 为空,代表越过叶节点,直接返回;
递归左子树,即 dfs(cur.left) ;
构建链表:
1.当 pre 为空时: 代表正在访问链表头节点,记为 head ;
2.当 pre 不为空时: 修改双向节点引用,即 pre.right = cur , cur.left = pre ;
3.保存 cur : 更新 pre = cur ,即节点 cur 是后继节点的 pre ;
递归右子树,即 dfs(cur.right) ;

treeToDoublyList(root):
1.特例处理: 若节点 root 为空,则直接返回;
2.初始化: 空节点 pre ;
3.转化为双向链表: 调用 dfs(root) ;
3.构建循环链表: 中序遍历完成后,head 指向头节点, pre 指向尾节点,因此修改 head 和 pre 的双向节点引用即可;
3.返回值: 返回链表的头节点 head 即可;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值