二叉树中序遍历

49 阅读1分钟
stateDiagram-v2
[root] --> leftNode
[root] --> rightNode

leftNode --> leftLeafLNode1
leftNode --> leftLeafRNode2

二叉树

  • 二叉树是n(n >= 0)个节点的集合,一棵树拥有一个根节点、左子树、右子树;节点之间互不相交;

中序遍历

  • 遍历顺序为:左子树 -> 根节点 -> 右子树

实现中序遍历的算法

//树的结构
  /**
   * Definition for a binary tree node.
   */
  function TreeNode(val, left, right) {
     this.val = (val===undefined ? 0 : val)
      this.left = (left===undefined ? null : left)
      this.right = (right===undefined ? null : right)
  }
  • 利用栈来进行遍历,栈是先进后出的一种数据结构;

    • 设定stack缓存栈,res为最终输出栈,current指向当前需要遍历的节点,用root来初始化;

      • 1.如果栈不为空,或者current不为null,进入循环;
      • 2.当current不为null,将current推入栈,current指向左节点,直至遍历结束;
      • 3.current指向stack栈中最后一个节点,该节点出栈推入res,将current指向该节点的右节点;
      • 4.右子树存在左节点,进入第二步,否则进行第三步;
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    let stack = [];
    let res = [];
    let current = root;
    while(current || stack.length > 0) {
        while (current) {
            stack.push(current)
            current = current.left;
        }
        current = stack.pop();
        res.push(current.val);
        current = current.right;
    }
    return res;
};

JavaScript

  • 按照示例:

    • 1.current -> root,进入判断,root入栈,current ->leftNode; stack = [root]
      1. leftNode 入栈,current -> leftLeafLNode1。stack = [root, leftNode]
    • 3.leftLeafLNode1入栈,current -> null; stack = [root, leftNode, leftLeafLNode1]
    • 4.跳出判断; current -> leftLeafLNode,leftLeafLNode.val进入输出栈; res = [leftLeafLNode1], stack = [root ,leftNode]; current -> leftLeafLNode1.right = null;
    • 5.不进入判断, current -> leftNode, leftNode推入输出栈, res = [ leftLeafLNode1, leftNode], stack = [ root]; current -> leftNode.right = leftLeafRNode2
  • 写不下去了你自己想吧。

  • 我的博客地址:http://60.204.150.29/?p=464 欢迎来访嗷