C++實(shí)現(xiàn)LeetCode(144.二叉樹的先序遍歷)
[LeetCode] 144. Binary Tree Preorder Traversal 二叉樹的先序遍歷
Given a binary tree, return the preorder traversal of its nodes' values.
Example:
Input:
[1,null,2,3]
1
\
2
/
3
Output:
[1,2,3]
Follow up: Recursive solution is trivial, could you do it iteratively?
一般我們提到樹的遍歷,最常見的有先序遍歷,中序遍歷,后序遍歷和層序遍歷,它們用遞歸實(shí)現(xiàn)起來都非常的簡單。而題目的要求是不能使用遞歸求解,于是只能考慮到用非遞歸的方法,這就要用到stack來輔助運(yùn)算。由于先序遍歷的順序是"根-左-右", 算法為:
1. 把根節(jié)點(diǎn) push 到棧中
2. 循環(huán)檢測棧是否為空,若不空,則取出棧頂元素,保存其值,然后看其右子節(jié)點(diǎn)是否存在,若存在則 push 到棧中。再看其左子節(jié)點(diǎn),若存在,則 push 到棧中。
參見代碼如下:
解法一:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if (!root) return {};
vector<int> res;
stack<TreeNode*> s{{root}};
while (!s.empty()) {
TreeNode *t = s.top(); s.pop();
res.push_back(t->val);
if (t->right) s.push(t->right);
if (t->left) s.push(t->left);
}
return res;
}
};
下面這種寫法使用了一個(gè)輔助結(jié)點(diǎn)p,這種寫法其實(shí)可以看作是一個(gè)模版,對應(yīng)的還有中序和后序的模版寫法,形式很統(tǒng)一,方便于記憶。輔助結(jié)點(diǎn)p初始化為根結(jié)點(diǎn),while 循環(huán)的條件是棧不為空或者輔助結(jié)點(diǎn)p不為空,在循環(huán)中首先判斷如果輔助結(jié)點(diǎn)p存在,那么先將p加入棧中,然后將p的結(jié)點(diǎn)值加入結(jié)果 res 中,此時(shí)p指向其左子結(jié)點(diǎn)。否則如果p不存在的話,表明沒有左子結(jié)點(diǎn),取出棧頂結(jié)點(diǎn),將p指向棧頂結(jié)點(diǎn)的右子結(jié)點(diǎn),參見代碼如下:
解法二:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
TreeNode *p = root;
while (!st.empty() || p) {
if (p) {
st.push(p);
res.push_back(p->val);
p = p->left;
} else {
p = st.top(); st.pop();
p = p->right;
}
}
return res;
}
};
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(144.二叉樹的先序遍歷)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)二叉樹的先序遍歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(52.N皇后問題之二)
- C++實(shí)現(xiàn)LeetCode(50.求x的n次方)
- C++實(shí)現(xiàn)LeetCode(49.群組錯(cuò)位詞)
- C++實(shí)現(xiàn)LeetCode(48.旋轉(zhuǎn)圖像)
- C++實(shí)現(xiàn)LeetCode(43.字符串相乘)
- C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù))
- C++實(shí)現(xiàn)LeetCode(40.組合之和之二)
- C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長度)
相關(guān)文章
C語言中的函數(shù)指針基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了C語言中的函數(shù)指針基礎(chǔ)學(xué)習(xí)教程,包括函數(shù)指針作為參數(shù)來傳遞等重要知識,需要的朋友可以參考下2016-04-04
C語言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析
用getchar()函數(shù)讀取字符串時(shí),字符串會存儲在輸入緩沖區(qū)中,包括輸入的回車字符,下面這篇文章主要給大家介紹了關(guān)于C語言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析的相關(guān)資料,需要的朋友可以參考下2022-03-03
Qt與Web混合開發(fā)實(shí)現(xiàn)雙向通信的示例
本文主要介紹了Qt與Web混合開發(fā)實(shí)現(xiàn)雙向通信的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Mingw64編譯wxWidgets 3.0.2常見錯(cuò)誤分析
這篇文章主要介紹了Mingw64編譯wxWidgets 3.0.2常見錯(cuò)誤分析,需要的朋友可以參考下2016-11-11
C++ Primer 標(biāo)準(zhǔn)庫vector示例詳解
該文章主要介紹了C++標(biāo)準(zhǔn)庫中的vector類型,包括其定義、初始化、成員函數(shù)以及常見操作,文章詳細(xì)解釋了如何使用vector來存儲和操作對象集合,并提供了代碼示例來說明vector的使用方法,感興趣的朋友一起看看吧2025-03-03
C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度,文章基于c語言的相關(guān)資料展開詳細(xì)介紹,具有一定的參價(jià)值,需要的小伙伴可以參考一下2022-05-05
c++中string類型和int類型相互轉(zhuǎn)換的幾種常用方法
我們在編寫程序時(shí),經(jīng)常涉及到int與string之間的類型轉(zhuǎn)換,本文主要介紹了c++中string類型和int類型相互轉(zhuǎn)換的幾種常用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

