一、基本的概念
节点:就是图中的1,2,3,4,5,6,7,8
节点的度:一个节点的孩子节点数。
树的度:他的节点的度数最高的度数。
叶子节点:没有孩子节点的节点。
分支节点:有孩子节点的节点。
内部节点:非叶子节点,非根节点。
父节点,子节点,这两个概念是相对的。
兄弟节点:同一个父节点,也包括堂兄弟节点
层次:上图中表示的层数。
平衡因子:左子树高度和右子树高度的差值。
二、特殊的二叉树
1,满二叉树:没有缺失的部分,他的节点的度为0/2
2,完全二叉树:除了最下面一层,上面的层都是满的树,最下面一层的节点是从左到右连续排列的(中间不能间断,间断的二叉树不能称之为完全二叉树)。
3,非完全二叉树:不符合完全二叉树的条件的树
4,二叉搜索树:左孩子的值<父节点的值<右孩子的值
5,平衡二叉搜索树:左子树和右子树高度差不大于1
三、遍历二叉树
- 递归遍历
- 非递归遍历
四、例题
1.中序后继
var inorderSuccessor = function(root, p) {const stack = [];let prev = null, curr = root;while (stack.length || curr) {while (curr) {stack.push(curr);curr = curr.left;}curr = stack.pop();if (prev === p) {return curr;}prev = curr;curr = curr.right;}return null;};
2.二叉树展开为链表
var flatten = function (root) {let list = []prevOrder(root, list)for (let i = 1; i < list.length; i++) {prev = list[i - 1],cur = list[i]prev.left = nullprev.right = cur}};// 前序遍历var prevOrder = function (root, list) {if (root) {list.push(root)prevOrder(root.left, list)prevOrder(root.right, list)}}
3.翻转二叉树
var invertTree = function(root) {if(root){const temp = root.right;root.right = root.left;root.left = temp;invertTree(root.right);invertTree(root.left);return root}return root};
