image.png

一、基本的概念

节点:就是图中的1,2,3,4,5,6,7,8
节点的度:一个节点的孩子节点数。
树的度:他的节点的度数最高的度数。
叶子节点:没有孩子节点的节点。
分支节点:有孩子节点的节点。
内部节点:非叶子节点,非根节点。
父节点,子节点,这两个概念是相对的。
兄弟节点:同一个父节点,也包括堂兄弟节点
层次:上图中表示的层数。
平衡因子:左子树高度和右子树高度的差值。

二、特殊的二叉树

1,满二叉树:没有缺失的部分,他的节点的度为0/2

二叉树 - 图2

2,完全二叉树:除了最下面一层,上面的层都是满的树,最下面一层的节点是从左到右连续排列的(中间不能间断,间断的二叉树不能称之为完全二叉树)。

二叉树 - 图3

3,非完全二叉树:不符合完全二叉树的条件的树

4,二叉搜索树:左孩子的值<父节点的值<右孩子的值
image.png
5,平衡二叉搜索树:左子树和右子树高度差不大于1

三、遍历二叉树

  1. 递归遍历
  2. 非递归遍历

    四、例题

    1.中序后继

    1. var inorderSuccessor = function(root, p) {
    2. const stack = [];
    3. let prev = null, curr = root;
    4. while (stack.length || curr) {
    5. while (curr) {
    6. stack.push(curr);
    7. curr = curr.left;
    8. }
    9. curr = stack.pop();
    10. if (prev === p) {
    11. return curr;
    12. }
    13. prev = curr;
    14. curr = curr.right;
    15. }
    16. return null;
    17. };

    2.二叉树展开为链表

    1. var flatten = function (root) {
    2. let list = []
    3. prevOrder(root, list)
    4. for (let i = 1; i < list.length; i++) {
    5. prev = list[i - 1],
    6. cur = list[i]
    7. prev.left = null
    8. prev.right = cur
    9. }
    10. };
    11. // 前序遍历
    12. var prevOrder = function (root, list) {
    13. if (root) {
    14. list.push(root)
    15. prevOrder(root.left, list)
    16. prevOrder(root.right, list)
    17. }
    18. }

    3.翻转二叉树

    1. var invertTree = function(root) {
    2. if(root){
    3. const temp = root.right;
    4. root.right = root.left;
    5. root.left = temp;
    6. invertTree(root.right);
    7. invertTree(root.left);
    8. return root
    9. }
    10. return root
    11. };