题目
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
思路
中序遍历:左节点——根节点——右节点
整体思路就是先去找最左边的左节点,然后pop到它的根节点之后,尝试找它是否有右节点
递归代码
/**
* 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)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
let ans = [];
//写一个inorder函数
let inorder = (root) =>{
if (!root){
return;
}
inorder(root.left);
ans.push(root.val);
inorder(root.right);
}
inorder(root);//调用函数
return ans;
};
js详解代码
/**
* 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)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
let ans = [];
let stack = []; //作为栈存储节点
//可能存在遍历到最上方的节点,右节点没有压入的情况,
//此时stack.length为0,但是循环并不应该结束,所以加上了root条件
//而root为空又是正常的,因为很可能没有右节点,但是stack里面还有数值
while(root || stack.length){
//这步不断的把某个节点的左节点压入栈
//左节点一气呵成,右节点一个一个的压
while(root){
stack.push(root);
root = root.left;
}
//对于每一个pop出去的节点,都检查是否有带有右节点
root = stack.pop();
ans.push(root.val);
root = root.right;
}
return ans;
};
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> order = new ArrayList<>();
if (root == null){
return order;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode node = stack.pop();
order.add(node.val);
if (node.right != null){
cur = node.right;
}
}
return order;
}
}