<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 0144. 二叉樹的前序遍歷 ## 題目地址(144. 二叉樹的前序遍歷) <https://leetcode-cn.com/problems/binary-tree-preorder-traversal/> ## 題目描述 ``` <pre class="calibre18">``` 給定一個二叉樹,返回它的 前序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,2,3] 進階: 遞歸算法很簡單,你可以通過迭代算法完成嗎? ``` ``` ## 前置知識 - 遞歸 - 棧 ## 公司 - 阿里 - 騰訊 - 百度 - 字節 ## 思路 這道題目是前序遍歷,這個和之前的`leetcode 94 號問題 - 中序遍歷`完全不一回事。 前序遍歷是`根左右`的順序,注意是`根`開始,那么就很簡單。直接先將根節點入棧,然后 看有沒有右節點,有則入棧,再看有沒有左節點,有則入棧。 然后出棧一個元素,重復即可。 > 其他樹的非遞歸遍歷可沒這么簡單 ![](https://img.kancloud.cn/75/9c/759c317ccc1a3d0a8da061110b0faadb_1290x857.jpg) (迭代 VS 遞歸) ## 關鍵點解析 - 二叉樹的基本操作(遍歷)> 不同的遍歷算法差異還是蠻大的 - 如果非遞歸的話利用棧來簡化操作 - 如果數據規模不大的話,建議使用遞歸 - 遞歸的問題需要注意兩點,一個是終止條件,一個如何縮小規模 - 終止條件,自然是當前這個元素是 null(鏈表也是一樣) - 由于二叉樹本身就是一個遞歸結構, 每次處理一個子樹其實就是縮小了規模, 難點在于如何合并結果,這里的合并結果其實就是`mid.concat(left).concat(right)`, mid 是一個具體的節點,left 和 right`遞歸求出即可` ## 代碼 - 語言支持:JS,C++ JavaScript Code: ``` <pre class="calibre18">``` <span class="hljs-title">/** * @param {TreeNode} root * @return {number[]} */</span> <span class="hljs-keyword">var</span> preorderTraversal = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">root</span>) </span>{ <span class="hljs-title">// 1. Recursive solution</span> <span class="hljs-title">// if (!root) return [];</span> <span class="hljs-title">// return [root.val].concat(preorderTraversal(root.left)).concat(preorderTraversal(root.right));</span> <span class="hljs-title">// 2. iterative solutuon</span> <span class="hljs-keyword">if</span> (!root) <span class="hljs-keyword">return</span> []; <span class="hljs-keyword">const</span> ret = []; <span class="hljs-keyword">const</span> stack = [root]; <span class="hljs-keyword">let</span> t = stack.pop(); <span class="hljs-keyword">while</span> (t) { <span class="hljs-keyword">if</span> (t.right) { stack.push(t.right); } <span class="hljs-keyword">if</span> (t.left) { stack.push(t.left); } ret.push(t.val); t = stack.pop(); } <span class="hljs-keyword">return</span> ret; }; ``` ``` C++ Code: ``` <pre class="calibre18">``` <span class="hljs-title">/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */</span> <span class="hljs-keyword">class</span> Solution { <span class="hljs-keyword">public</span>: <span class="hljs-params">vector</span><<span class="hljs-keyword">int</span>> preorderTraversal(TreeNode* root) { <span class="hljs-params">vector</span><<span class="hljs-keyword">int</span>> v; <span class="hljs-params">vector</span><TreeNode*> s; <span class="hljs-keyword">while</span> (root != <span class="hljs-params">NULL</span> || !s.empty()) { <span class="hljs-keyword">while</span> (root != <span class="hljs-params">NULL</span>) { v.push_back(root->val); s.push_back(root); root = root->left; } root = s.back()->right; s.pop_back(); } <span class="hljs-keyword">return</span> v; } }; ``` ``` **復雜度分析** - 時間復雜度:O(N)O(N)O(N) - 空間復雜度:O(N)O(N)O(N) ## 相關專題 - [二叉樹的遍歷](https://github.com/azl397985856/leetcode/blob/master/thinkings/binary-tree-traversal.md) 大家對此有何看法,歡迎給我留言,我有時間都會一一查看回答。更多算法套路可以訪問我的 LeetCode 題解倉庫:<https://github.com/azl397985856/leetcode> 。 目前已經 37K star 啦。 大家也可以關注我的公眾號《力扣加加》帶你啃下算法這塊硬骨頭。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看