二叉树的实现  introduction to algorithm  英文版实现 ,中文版的实现跟英文版本略有不同,个人觉得中文版本换key的方式更好,英文版换了2次指针

function BinaryTree(){this.root=null;
}
BinaryTree.prototype.inorder_tree_walk=function(x){if(typeof x=='undefined'){x=this.root;}if(!!x){this.inorder_tree_walk(x.left);console.log(x.key);this.inorder_tree_walk(x.right);}
}
BinaryTree.prototype.tree_search=function(x,key){if(typeof x=='undefined'){x=this.root;}if(x==null||key==x.key){return x;}if(key<x.key){return this.tree_search(x.left,key);}else{return this.tree_search(x.right,key);}
}
BinaryTree.prototype.minimun=function(x){while(x.left!=null){return this.minimun(x.left);}return x;
}
BinaryTree.prototype.maximun=function(x){while(x.right!=null){return this.maximun(x.right);}return x;
}
BinaryTree.prototype.successor=function(x){if(x.right!=null){return this.minimun(x.right);}var y=x.parent;while(y!=null&&x==y.right){x=y;y=y.parent;}return y;
}
BinaryTree.prototype.predecessor=function(x){if(x.left!=null){return this.maximun(x.left);}var y=x.parent;while(y!=null&&x==y.left){x=y;y=y.parent;}return y;
}
/*node {left:null,right:null,key}*/
BinaryTree.prototype.insert=function(node){var y=null;var x=this.root;while(x!=null){y=x;if(node.key<x.key){x=x.left;}else{x=x.right;}}node.parent=y;if(y==null){this.root=node;}else if(node.key<y.key){y.left=node;}else{y.right=node;}
}
function _transplant(t,u,v){if(u.parent==null){// delete node ,node left null,node parent null => node.right to be root;// delete node ,node right null,node parent null => node.left to be root; t.root=v;}else if(u==u.parent.left){//delete node is its parent left nodeu.parent.left=v;}else{//delet node is its parent right node;u.parent.right=v;}if(v!=null){// fix pointer;v.parent=u.parent;}
}
BinaryTree.prototype.delete=function(node){if(node.left==null){_transplant(this,node,node.right);}else if(node.right==null){_transplant(this,node,node.left);}else{var y=this.minimun(node.right);if(y.parent!=node){// successor left node must be null;_transplant(this,y,y.right);y.right=node.right;y.right.parent=y;}_transplant(this,node,y);y.left=node.left;y.left.parent=y;}
}

后继 和 前继  的 2中特殊情况

delete的 3种情况 以 最后一种 有双亲最为复杂,红黑树的实现基于二叉树,下一波就要继续review 红黑树的代码了,惯例以后补图

经过几种场景的测试,二叉树是一种不平衡的树,依赖于insert的顺序,最差的查找情况就是 n,跟链表一样

转载于:https://www.cnblogs.com/horsefefe/p/5724225.html

binary_sort 二叉树相关推荐

  1. 二叉树的前序、中序、后序非递归遍历 python实现

    前言 python中二叉树的定义: class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None ...

  2. 二叉树中和为某一值的路径

    前言 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数 ...

  3. 判断某数组是不是二叉树的前序遍历序列 python递归

    code class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) <= 0 ...

  4. 翻转二叉树 c语言实现 递归 栈 队列

    前言 题目比较好理解,就是翻转二叉树 代码 c语言实现 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  5. python实现二叉树的重建2 之由中序遍历和后序遍历重建

    前言 通过上一节对python实现二叉树的重建1 之由前序遍历和中序遍历重建,我相信我们再来做这个问题就不难了,完全可以照猫画虎的来实现,具体的原理几乎是一样的,直接上代码了 code # 通用解法d ...

  6. 通过前序遍历和中序遍历构建二叉树 python实现

    前言 通过前序遍历和中序遍历构建二叉树的原理,主要是找前序遍历根节点在中序遍历中的位置,然后将二叉树而成左子树和右子树,然后依次进行这样的操作,思路还是比较简单的 代码 class Node:def ...

  7. 关于二叉树的层次遍历的花样(c++实现)

    花样变形1::二叉树层次遍历但是分层打印 分析:与普通打印多了一个分层打印,其实只要在在层次遍历中多设置一个标记变量即可 代码如下: //二叉树的层次遍历 void levelTravel(BTNod ...

  8. LeetCode简单题之二叉树的层平均值

    题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值.与实际答案相差 10-5 以内的答案可以被接受. 示例 1: 输入:root = [3,9,20,null,null ...

  9. LeetCode简单题之二叉树的最大深度

    题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15, ...

最新文章

  1. spark-submit --files 动态加载外部资源文件
  2. iOS开发JSON字符串和字典互转
  3. poj 1873 枚举+凸包
  4. python学习框架图-Python学习—框架篇之初识Django
  5. 挑战独立开发项目能力___ITlanbao
  6. Operation condition And timing analysis
  7. spark 把一列数据合并_Spark Java-合并同一列多行 - java
  8. Misc-wireshark-1(秒懂!!)
  9. 量子纠缠(三)——波尔和爱因斯坦之争
  10. Spring Boot的自动配置的原理
  11. 基于tcp实现远程执行命令
  12. delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法...
  13. 射频芯片,最全介绍!
  14. selenium模拟鼠标滑动
  15. CentOs7和leapftp的时候遇到的一些坑
  16. 多元函数偏导数连续、存在与可微的关系
  17. linux服务器安装杀毒软件
  18. 按键精灵 excel mysql_按键精灵常用插件介绍
  19. PHP生成唯一订单号 阿星小栈
  20. 斯坦福ML课程——python转写(Week7—课程作业ex6_2)

热门文章

  1. 如何读取服务器信息吗,New Features Introduced in IIS 10.0 Version 1709
  2. 微型计算机每字节的最高位时,计算机应用基础考试题加答案
  3. tcpdump抓包实例
  4. C语言中为什么要使用enum
  5. 爬虫 - HDU题目信息
  6. mysql一个用户SQL慢查询分析,原因及优化
  7. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation by 解决方案
  8. fgets函数及其用法,C语言fgets函数详解
  9. C++异常处理(try catch throw)完全攻略
  10. const_iterator简单介绍