二叉树之先序遍历

对二叉树进行遍历时,即将对整个树的遍历不断转换为对每个结点进行同样的遍历。

1.递归思想

思路:
(1)对根结点进行访问;
(2)对根结点的左子树进行先序遍历;
(3)对根结点的右子树进行先序遍历。
代码:
参考:递归遍历二叉树

const TreeNode = {
    val: 1,
    left: {
      val: 2,
      left: {
        val: 4,
      },
      right: {
        val: 5
      }
    },
    right: {
      val: 3,
      left: {
        val: 6,
      },
      right: {
        val: 7
      }
    }
  };
 
  var preOrderRecur = function(root){
    var list = [];
    var preOrder = function(root){
      if(root === undefined){
        return;
      }
      list.push(root.val)
      preOrder(root.left);
      preOrder(root.right);
    }
    preOrder(root);
    return list;
  }
var list = preOrderRecur(TreeNode);
console.log('递归前序遍历', list);

理解代码,重点在于理解,先序遍历对于每个结点,都是先访问该结点,再访问其左子树,再访问其右子树。

2.迭代思想

一旦对根结点进行访问,便会接着访问它的左孩子,接着便会访问它的左孩子的左孩子… 一直到当前结点的左孩子为空,形成一条左侧链。接着便会访问该结点的右子树 -> 上一层左结点的右子树 … -> …最后一个右结点。先自顶向下的访问左侧链上的各结点,再自底向上的依次遍历每一层上的右子树。即对任意结点进行访问时,都会先沿着该结点左侧分支依次进行访问。
思路:
从整棵二叉树的根结点开始,对于任意结点D,访问D结点,若D的右结点不为空,则将D结点的右结点入栈,继续访问D的左结点,并对该左结点的左右结点进行同样的操作。判断D的左结点是否为空,若为空,则弹出栈顶,若栈为空,则退出算法。

const TreeNode = {
    val: 1,
    left: {
      val: 2,
      left: {
        val: 4,
      },
      right: {
        val: 5
      }
    },
    right: {
      val: 3,
      left: {
        val: 6,
      },
      right: {
        val: 7
      }
    }
  };
var preOrder = function(root) {
    var list = [];
    const remStack = [];
    while(root) {
        while (root) {
            list.push(root.val)
            if (root.right) {
                remStack.push(root.right);
            }
            root = root.left;
        }
        if (remStack.length == 0) {
            break;
        }
        root = remStack.pop()
    }
    return list;
}
console.log(preOrder(TreeNode));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值