找到二叉树中符合搜索二叉树条件的最大拓扑结构
给定一棵二叉树的头节点 head,已知所有节点的值都不一样,返回其中最大的、且符合搜索二叉树

条件的拓扑结构的节点数。这里的拓扑结构是指,你可以在二叉树中任意选择某些节点,只要这些节 点是连在一起的,都叫做二叉树的拓扑结构。

public static class Node{public int value;public Node right;public Node left;public Node(int data){this.value = data;}
}public static int bstTopoSize1(Node head){if(head == null){return 0;}int max = maxTopo(head, head);max = Math.max(bstTopoSize1(head.left), max);max = Math.max(bstTopoSize1(head.right), max);return max;
}public static int maxTopo(Node h, Node n){if(h != null && n != null && isBSTNode(h,n,n.value)){return maxTopo(h, n.left) + maxTopo(h, n.right) + 1;}return 0;
}public static boolean isBSTNode(Node h, Node n, int value){if(h == null){return false;}if(h == n){return true;}return isBSTNode(h.value > h.left : h.right, n, value);
}public static class Record{public int l;public int r;public Record(int left, int right){this.l = left;this.r = right;}
}public static int bstTopoSize2(Node head){Map<Node, Record> map = new HashMap<Node, Record>();return posOrder(head, map);
}public static int posOrder(Node h, Map<Node, Record> map){if(h == null){return 0;}int ls = posOrder(h.left, map);int rs = posOrder(h.right, map);modifyMap(h.left, h.value, map, true);modifyMap(h.right, h.value, map, false);Record lr = map.get(h.left);Record rr = map.get(h.right);int lbst = lr = null ? 0 : lr.l + lr.r + 1;int rbst = rr = null ? 0 : rr.l + rr.r + 1;map.put(h, new Record(lbst, rbst));return Math.max(lbst + rbst + 1, Math.max(ls, rs));
}public static int modifyMap(Node n, int v, Map<Node, Record> m, boolean s){if(n == null || (!m.containsKey(n))){return 0;}Record r = m.get(n);if((s && n.value > v) || ((!s) && n.value < v)){m.remove(n);return r.l + r.r + 1;}else{int minus = modifyMap(s ? n.right, v, m, s);if(s){r.r = r.r - minus;}else{r.l = r.l - minus;}m.put(n, r);return minus;}
}

找到二叉树中符合搜索二叉树条件的最大拓扑结构相关推荐

  1. numpy找到数组中符合条件的数

    numpy找到数组中符合条件的数 import numpy as nparr = np.array([1, 1, 1, 134, 45, 3, 46, 45, 65, 3, 23424, 234, 1 ...

  2. 牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案

    牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案 题解: 搜索二叉树满足以下性质: 1.非空左子树的所以键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 ...

  3. 算法(63)-二叉树的递归-搜索二叉树-满二叉树-平衡二叉树-

    目录 1.二叉树 2.搜索二叉树: 3.满二叉树: 4.平衡二叉树 1.二叉树 先.中.后序遍历    先序(中.左.右):1,2,4,5,3,6,7    中序(左.中.右):4,2,5,1,6,3 ...

  4. 判断一棵二叉树是否为搜索二叉树、完全二叉树、平衡二叉树(java)

    平衡二叉树的解法:主要是求出二叉树的高度,若根节点的左子树的高度与右子树的高度差小于等于1,则表示该二叉树为平衡二叉树 public static class Node{public int valu ...

  5. 判断一颗二叉树是否为搜索二叉树和完全二叉树

    搜索二叉树:二叉树的中序遍历,在遍历的过程中,节点值都是递增的 class Node(object):def __init__(self,value):self.value = valueself.r ...

  6. 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...

  7. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  8. 调整搜索二叉树中两个错误的节点

    一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回.已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 head,返回一个长度为 ...

  9. 寻找搜索二叉树中两个错误的节点

    题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...

最新文章

  1. CF715B. Complete The Graph
  2. java hashmap 无序,【Java】HashMap自定义排序
  3. php 动态链接,LevelDB(动态链接) + PHP扩展 安装
  4. Variable、Tensor、Numpy的转换
  5. 专升本c语言网课听谁的好_都说塑钢泥比玻璃胶好,填缝永不变黑,师傅却说不好用,听谁的?...
  6. I2C驱动12864液晶模块程序分享ARDUINO UNO
  7. 华为数通HCIE很好考吗?
  8. Python词频统计
  9. Windows10清理C盘的恶意软件
  10. 我的世界服务器存档的文件夹,我的世界存档在哪个文件夹
  11. 安卓真机如何连接本地服务器_Android真机连接本地服务器安装部署方法
  12. 橘子学ES11之URI搜索方式
  13. Linux常用指令与操作
  14. 女子手机流量一夜疯跑了50GB
  15. 【更新版】域名安全防护智能解析DNS+CDN免费产品
  16. B端产品经理如何做好客户访谈?
  17. 从BIO到NIO、AIO和零拷贝
  18. 操作系统Android的特点.,安卓操作系统有哪些特点?
  19. 帝国の炮王的陨落-----张泽宇
  20. R 获取exon长度

热门文章

  1. python 输出字符串编码_Python print 字符串编码问题
  2. Lua5.3手册标准库拾遗
  3. 201807 相关性度量的几种方法-卡方检验、相关系数、信息增益...
  4. 剑指offer 面试31题
  5. ALGO-22_蓝桥杯_算法训练_数的划分(DP)
  6. showModalDialog sesission丢失
  7. 在线html表格设计器,6款优秀的在线表单设计器
  8. 《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
  9. sqlserver on linux
  10. Oracle——15触发器