二叉樹的遍歷

面試中經(jīng)常會考的一道題目,就是二叉樹的遍歷,很簡單,你會說“使用遞歸,根據(jù)要求(前序、中序、后序,以中序為例)依次對節(jié)點和其左右子節(jié)點調(diào)用遞歸方法。

public void printNode(Node node) {
    if (null != node.left)
        printNode(node.lef);
    System.out.print(node.toString());
    if(null != node.right)
        printNode(node.right);
    }

一般還會繼續(xù)追問"能否使用非遞歸的方法?",在美團點評面試的時候就被問到了(同LeetCode 144)。這時候,我們可以使用棧來完成,分為下面三個步驟:

  1. 深度遍歷找到這棵樹最左邊的節(jié)點,這個過程中將遍歷的節(jié)點壓入棧中。
  2. 將棧中的節(jié)點pop出來,如果該節(jié)點有右子節(jié)點,對右子節(jié)點進(jìn)行步驟一的操作,如果沒有,則可以打印出來,繼續(xù)pop棧。
  3. 當(dāng)棧空了或者進(jìn)行操作的根節(jié)點為空時推出循環(huán)。
    下面就用代碼來實現(xiàn)一下LeetCode 144
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
       ArrayList<Integer> result = new ArrayList<>();
        if (null == root) {
            return null;
        }
        Stack<TreeNode> nodeStack = new Stack<>();

        TreeNode temp = root;

        while (null != temp || !nodeStack.empty()) {
            nodeStack.push(temp);
            result.add(temp.val);
            while (null != temp.left) {
                temp = temp.left;
                nodeStack.push(temp);
                result.add(temp.val);
            }
            while (!nodeStack.empty() && null == nodeStack.peek().right) {
                nodeStack.pop();
            }
            if (nodeStack.empty())
                break;
            temp = nodeStack.pop();
            if (null != temp.right) {
                temp = temp.right;
                continue;
            }
        }
        return result; 
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 二叉樹的三種常用遍歷方式 學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的同學(xué)都清楚,除了層序遍歷外,二叉樹主要有三種遍歷方式: 1. 先序遍歷...
    SherlockBlaze閱讀 1,320評論 0 4
  • http://m.itdecent.cn/p/49c8cfd07410 解決二叉樹的很多問題的方案都是基于對二...
    MSG猿閱讀 831評論 0 0
  • -先序遍歷: 訪問根結(jié)點,先序遍歷其左子樹,先序遍歷其右子樹;運用到遞歸void PreOrderTraversa...
    Spicy_Crayfish閱讀 2,129評論 0 0
  • 二叉樹的遍歷想必大家都不陌生,主要有三種遍歷方式:前序遍歷(pre-order traversal),中序遍歷(i...
    akak18183閱讀 1,225評論 0 1
  • 構(gòu)造 二叉樹的構(gòu)造。先要有一棵樹,才能遍歷一棵樹。 首先構(gòu)造一顆簡單的完全二叉樹 刪去一些節(jié)點: 生成了一棵樹,開...
    IAmWhoAmI閱讀 245評論 0 2

友情鏈接更多精彩內(nèi)容