二叉树中最大二叉搜索子树的头结点 (二叉树的递归套路)

给定一颗二叉树的头结点head,返回这个二叉树中最大二叉搜索子树的头结点

代码实现

public class Code02_MaxSubBSTHead {
    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

    public static class Info {
        public Node maxSubBSTHead;
        public int maxSubBSTSize;
        public int min;
        public int max;

        public Info(Node maxSubBSTHead, int maxSubBSTSize, int min, int max) {
            this.maxSubBSTHead = maxSubBSTHead;
            this.maxSubBSTSize = maxSubBSTSize;
            this.min = min;
            this.max = max;
        }
    }

    public static Node maxSubBSTHead(Node head) {
        if (head == null) {
            return null;
        }
        return process(head).maxSubBSTHead;
    }

    private static Info process(Node head) {
        if (head == null) {
            return null;
        }

        Info leftInfo = process(head.left);
        Info rightInfo = process(head.right);

        int min = head.value;
        int max = head.value;
        int maxSubBSTSize = 0;
        Node maxSubBSTHead = null;

        if (leftInfo != null) {
            min = Math.min(leftInfo.min, min);
            max = Math.max(leftInfo.max, max);
            maxSubBSTSize = leftInfo.maxSubBSTSize;
            maxSubBSTHead = leftInfo.maxSubBSTHead;
        }

        if (rightInfo != null) {
            min = Math.min(rightInfo.min, min);
            max = Math.max(rightInfo.max, max);
            if (rightInfo.maxSubBSTSize > maxSubBSTSize) {
                maxSubBSTHead = rightInfo.maxSubBSTHead;
                maxSubBSTSize = rightInfo.maxSubBSTSize;
            }
        }

        // 如果左子树的maxSubBSTHead等于当前节点左孩子节点 并且 右子树的maxSubBSTHead等于当前节点右孩子节点
        // 说明左孩子和右孩子都是二叉搜索子树,可以整棵树被当前节点加入
        // 并且当前节点加入后仍然是二叉搜索树,则可以将当前节点加入,成为maxSubBSTHead
        if ((leftInfo == null ? true : (leftInfo.maxSubBSTHead == head.left && head.value > leftInfo.max))
                && 
            (rightInfo == null ? true : (rightInfo.maxSubBSTHead == head.right && head.value < rightInfo.min))) {
            maxSubBSTHead = head;
            maxSubBSTSize = (leftInfo == null ? 0 : leftInfo.maxSubBSTSize) + (rightInfo == null ? 0 : rightInfo.maxSubBSTSize) + 1;
        }

        return new Info(maxSubBSTHead, maxSubBSTSize, min, max);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤编写算法: 1. 定义二叉树点的构体,包含数据域、左指针和右指针。 ```c typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; }TreeNode; ``` 2. 定义交换左右的函数,函数接受一个二叉树的根节点指针作为参数。 ```c void swap(TreeNode* root) { if (root == NULL) { return; } // 交换左右 TreeNode* temp = root->left; root->left = root->right; root->right = temp; // 归交换左右 swap(root->left); swap(root->right); } ``` 3. 测试函数。 ```c int main() { // 构造二叉树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->data = 2; root->left->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->left->data = 4; root->left->left->left = NULL; root->left->left->right = NULL; root->left->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->right->data = 5; root->left->right->left = NULL; root->left->right->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->data = 3; root->right->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right->left->data = 6; root->right->left->left = NULL; root->right->left->right = NULL; root->right->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->right->data = 7; root->right->right->left = NULL; root->right->right->right = NULL; // 交换左右 swap(root); // 遍历交换后的二叉树 printf("Inorder traversal of the swapped binary tree is: "); inorder(root); printf("\n"); return 0; } ``` 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值