LeetCode 之 JavaScript 解答第94題 —— 二叉樹的中序遍歷


Time:2019/4/25
Title:Binary Tree Inorder Traversal
Difficulty: Medium
Author:小鹿javascript


題目:Binary Tree Inorder Traversal(二叉樹中序遍歷)

Given a binary tree, return the inorder traversal of its nodes' values.java

給定一個二叉樹,返回它的 中序 遍歷。

Example:node

Input: [1,null,2,3]
   1
    \
     2
    /
   3

Output: [1,3,2]

Follow up: Recursive solution is trivial, could you do it iteratively?git

進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?

solve:

▉ 問題分析
1)二叉樹的前、中、後遍歷,首先明白前、中、後遍歷的順序是什麼,對於二叉樹的中序遍從來說,順序是左子樹節點 —> 根節點 —> 右子樹節點。

2)一般遞歸的方法解決二叉樹的遍歷最方便不過,可是我仍是喜歡增長點難度,用通常的迭代循環來實現。github

▉ 算法思路
遞歸法:

1)判斷當前樹是否爲空。算法

2)遞歸樹的左子樹結點。編程

3)輸出當前結點的值。code

4)遞歸樹的右子樹節點。遞歸

迭代循環法:ip

1)聲明一個棧,將樹的左子節點入棧。

2)每出棧一個結點,輸出當前結點的值,且將該結點的右子樹進行遍歷打印,保證每一個出棧的結點輸出值以後,再輸出上一個左子節點以前,將當前結點的右子節點遍歷畢。

3)整棵樹遍歷完畢的終止條件就是當前棧是否存在結點(樹的左子節點)。

▉ 遞歸實現
var inorderTraversal = function(root) {
    let arr = []
    const inorder = root =>{
        // 判斷當前的結點是否爲空
        if(root == null) return null;
        // 遞歸左子樹
        inorder(root.left)
        // 輸出結點值
        arr.push(root.val)
        // 遞歸右子樹
        inorder(root.right)
    }
    inorder(root)
    return arr
};
▉ 迭代實現
// 迭代實現二叉樹的中序遍歷
var inorderTraversal = function(root) {
    let stack = [];
    let result = [];

    while(true){
        // 判斷樹是否爲空
        if(root == null) return result;

        // 先將樹的左子節點推入棧中
        while(root !== null){
            stack.push(root);
            root = root.left;
        }

        // 遍歷的終止條件
        if(stack.length !== 0){
            // 輸出棧中的結點
            let temp = stack.pop();
            result.push(temp.val);
            // 若是當前存在右子節點,要先打印右子樹節點
            root = temp.right;
        }else{
            break;
        }
    }
    return result;
}
▉ 觸類旁通
1)試着分別寫出前序遍歷、後序遍歷的遞歸實現和迭代實現代碼。



歡迎一塊兒加入到 LeetCode 開源 Github 倉庫,能夠向 me 提交您其餘語言的代碼。在倉庫上堅持和小夥伴們一塊兒打卡,共同完善咱們的開源小倉庫!
Github: https://github.com/luxiangqia... 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。
相關文章
相關標籤/搜索