力扣#94 樹的中序遍歷

SkySource發表於2024-03-16

對樹的分支情況進行簡單列舉如圖1所示,圖中圓形表示樹的節點,實線連線每個節點,虛線表示後期將要新增的“連線”以便節點順序進行中序遍歷,節點旁邊的數字表示中序遍歷的遍歷順序。

圖1 樹的分支情況

透過圖1觀察到兩個結論:

  1. 右節點只需要按順序遍歷

  2. 有左節點就一定需要一條“回溯”的連結

假設存在x,有x->left表示x的左節點,x->right表示x的右節點,x->val表示x的值

圖2 流程

圖3 結果

C++程式碼如下:

 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
while (root != nullptr) {
if (root->left == nullptr) {
res.push_back(root->val);
root = root->right;
} else {
TreeNode *tmp = root->left;
while (tmp->right != nullptr) {
tmp = tmp->right;
}
tmp->right = root;
root = root->left;
tmp->right->left = nullptr;
}
}
return res;
}
};


相關文章