树的概念
通常树和递归有关,当面试官问你树的问题时,是在考察你递归算法的能力。
树常考结构
- 普通二叉树
- 平衡二叉树
- 完全二叉树
- 二叉搜索树
- 四叉树
- 多叉树
- 红黑树
-
树的考点
树的遍历:前序遍历,中序遍历,后序遍历
-
二叉树的特点
每个结点最多有两颗子树
- 左子树和右子树都是有顺序的,次序不能换
-
二叉查找树
二叉查找树是一种 特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中。
function Node(data, left, right) {this.data = data;this.left = left;this.right = right;this.show = show;}function show() {return this.data;}
Node 对象既保存数据,也保存和其他节点的链接(left 和 right),show() 方法用来显示 保存在节点中的数据。
function BST() {this.root = null;this.insert = insert;}function insert(data) {var n = new Node(data, null, null);if (this.root == null) {this.root = n;}else {var current = this.root;var parent;while (true) {parent = current;if (data < current.data) {current = current.left;if (current == null) {parent.left = n;break;}}else {current = current.right;if (current == null) {parent.right = n;break;}}}}}
根结点为空就插入根结点,不为空就检查插入的节点。
- 如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点
-
中序遍历
中序遍历按照节点上的键值,以升序访问 BST 上的所有节点。中序遍历按元素大小从小到大遍历
function inOrder(node) {if (!(node == null)) {inOrder(node.left);console.log(node.show()) //遍历代码inOrder(node.right);}}
从 nums.root 进入,一直执行 inOrder(node.left) 直到进入最左边的结点假设从 node1 进入 node2 ,此时 inOrder(node2.left) 为空,那么代码就会执行 inOrder(node1.right)。

10 的左子树为空时,执行遍历代码,然后检查右子树
- 10 的右子树结束后,开始 执行 22 的遍历代码,然后检查 22 的右子树
前序和后序
意 inOrder() 和 preOrder() 方法的唯一区别,就是 if 语句中代码的顺序。在 inOrder() 方法中,show() 函数像三明治一样夹在两个递归调用之间;在 preOrder() 方法中,show() 函数放在两个递归调用之前。同理后序遍历。function preOrder(node) {if (!(node == null)) {console.log(node.show()) //遍历代码preOrder(node.left);preOrder(node.right);}}
