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]
-
- 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 欢迎来访嗷