博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
合并两颗平衡有序二叉树
阅读量:6712 次
发布时间:2019-06-25

本文共 1928 字,大约阅读时间需要 6 分钟。

问题描述

给定两颗平衡的有序二叉树,要求将这两个二叉树合并为一个平衡的有序二叉树。

问题解答

假定两个数的结点数分别为m和n。

思路1

很容易想到把一颗树的每一个结点依次添加到另一颗树中,每次插入的平均时间复杂度为O(logn),在最坏情况下的插入时间复杂度为O(m + logn)。合并为一棵树的平均时间复杂度为O(mlog(m + n))。

单纯地将节点插入树中会破坏树的平衡性,因此之后需要将树展开为链表然后再生成平衡二叉树,时间复杂度为O(m + n)。

在插入过程中保持树的平衡性实现起来很困难,而且时间复杂度也会相应增加。

思路2:

考虑到结果二叉树是平衡的,因此将树展开然后生成平衡二叉树是无法避免的,因此可以考虑以下做法。

首先,将两棵树分别展开为有序链表,时间复杂度分别为O(m)和O(n);

public TreeNode prev = null;    public void BSTtoLinkedList(TreeNode root) {        if (root == null) return;        BSTtoLinkedList(root.left);        if (prev != null) {            prev.right = root;            prev.left = null;        }        prev = root;        BSTtoLinkedList(root.right);    }

 

然后将两个有序链表合并,时间复杂度为O(m + n);

public TreeNode MergeTwoLinkedList(TreeNode n1, TreeNode n2) {        TreeNode head = new TreeNode();        while (n1 != null && n2 != null) {            if (n1.val < n2.val) {                head.right = n1;                n1 = n1.right;            } else {                head.right = n2;                n2= n2.right;            }            head = head.right;        }        if (n1 != null) {            head.right = n1;            head = head.right;        }        if (n2 != null) {            head.right = n2;            head = head.right;        }        return head.right;    }

 

最后把一个有序链表转化为一个平衡二叉树,时间复杂度为O(m + n)。

public TreeNode LinkedListToBalancedBST(TreeNode root) {        int num = 0;        while (root != null) {            num++;            root = root.right;        }        return ListToBST(root, num);    }    public TreeNode cur = null;    public TreeNode ListToBST(TreeNode root, int num) {        if (num <= 0) return null;        if (cur == null) cur = root;        TreeNode left = ListToBST(root, num / 2);        TreeNode temp = cur;        cur = cur.right;        temp.right = ListToBST(cur, num - 1 - num / 2);        temp.left = left;        return temp;    }

 

转载于:https://www.cnblogs.com/shinning/p/6243503.html

你可能感兴趣的文章
在Ubuntu的系统中怎样将应用程序加入到開始菜单中
查看>>
SDL绑定播放窗口 及 视频窗口缩放
查看>>
BIO与NIO、AIO的区别(这个容易理解)
查看>>
springboot+mybatis+ehcache实现缓存数据
查看>>
MUI 选项卡切换+下拉刷新动态 完整实现一例
查看>>
2017年11月GitHub上最热门的Java项目出炉
查看>>
Vim操作的四种模式
查看>>
CentOS下的yum upgrade和yum update区别,没事别乱用,和Ubuntu的update不一样!
查看>>
Web Service——CXF发布REST服务
查看>>
js进阶 11-22/23 js如何实现选项卡
查看>>
[WPF 容易忽视的细节] —— x:Name与Name属性
查看>>
asp.net Core多环境读取Json
查看>>
beamer 模板
查看>>
Max Sum
查看>>
PHP图像处理(一) GraphicsMagick介绍与安装
查看>>
tomcat 优化
查看>>
java定义二维数组的几种写法_nino收藏夹_百度空间
查看>>
8个惊艳的JavaScript 为 HTML5 Canvas 提供硬件3D加速渲染应用实验
查看>>
Basic INFO - 如何在测试机环境中Debug InstallScript安装包
查看>>
JavaScript中的数组
查看>>