二叉树总结

本文介绍了二叉树的种类,包括满二叉树、完全二叉树、完美二叉树、二叉搜索树和平衡二叉搜索树。接着讨论了二叉树的两种存储方式——链式存储和线性存储,并详细阐述了四种遍历方法:前序、中序、后序和层序遍历。最后提到了二叉树的构造方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、种类

1.满二叉树:除了叶子节点外,每个节点都有2个子节点,节点数量为2的k次方 - 1
2.完全二叉树:底层从左到右连续
3.完美二叉树:同时具备满二叉树和完全二叉树的条件
4.二叉搜索树:左孩子的值 < 当前节点的值 < 右孩子的值
5.平衡二叉搜索树:左子树和右子树高度的绝对值 <= 1

二、存储方式

1.链式存储

在这里插入图片描述

2.线性存储
在这里插入图片描述

三、遍历方式

1.前序遍历

递归法

function traversal(cur, arr) {
  if (cur == NULL) return;
  arr.push(cur.val);    // 中
  traversal(cur.left, arr);  // 左
  traversal(cur.right, arr); // 右
  return arr
}

迭代法

// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {
    if(!root) return res;
    const stack = [root];
    let cur = null;
    while(stack.length) {
        cur = stack.pop();
        res.push(cur.val);
        cur.right && stack.push(cur.right);
        cur.left && stack.push(cur.left);
    }
    return res;
};

2.中序遍历

递归法

function traversal(cur, arr) {
  if (cur == NULL) return;
  traversal(cur.left, arr);  // 左
  arr.push(cur.val);    // 中
  traversal(cur.right, arr); // 右
  return arr
}

迭代法

// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右

var inorderTraversal = function(root, res = []) {
    const stack = [];
    let cur = root;
    while(stack.length || cur) {
        if(cur) {
            stack.push(cur);
            // 左
            cur = cur.left;
        } else {
            // --> 弹出 中
            cur = stack.pop();
            res.push(cur.val); 
            // 右
            cur = cur.right;
        }
    };
    return res;
};

3.后序遍历

递归法

function traversal(cur, arr) {
  if (cur == NULL) return;
  traversal(cur.left, arr);  // 左
  traversal(cur.right, arr); // 右
  arr.push(cur.val);    // 中
  return arr
}

迭代法

// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转

var postorderTraversal = function(root, res = []) {
    if (!root) return res;
    const stack = [root];
    let cur = null;
    do {
        cur = stack.pop();
        res.push(cur.val);
        cur.left && stack.push(cur.left);
        cur.right && stack.push(cur.right);
    } while(stack.length);
    return res.reverse();
};

4.层序遍历

var levelOrder = function(root) {
    //二叉树的层序遍历
    let res=[],queue=[];
    queue.push(root);
    if(root===null){
        return res;
    }
    while(queue.length!==0){
        // 记录当前层级节点数
        let length=queue.length;
        //存放每一层的节点 
        let curLevel=[];
        for(let i=0;i<length;i++){
            let node=queue.shift();
            curLevel.push(node.val);
            // 存放当前层下一层的节点
            node.left&&queue.push(node.left);
            node.right&&queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curLevel);
    }
    return res;
};

四、构造二叉树

class Node { // 定义节点
  constructor(val){
	this.val = val
	this.left = null
	this.right = null
  }
}

const createTree = (arr) => { // 创建二叉树
  let tree = new Node(arr[0])
  let Nodes = [tree]
  let i = 1
  for (let node of Nodes){
    if (arr[i] === null) Nodes.push(node.left = null)
    else Nodes.push(node.left = new Node(arr[i]))
    i += 1
    if (i == arr.length) return tree
    if (arr[i] === null) Nodes.push(node.right = null)
    else Nodes.push(node.right = new Node(arr[i]))
    i += 1
    if (i == arr.length) return tree
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值