用迭代法练习LeetCode的两道题:144.二叉树的前序遍历 94.二叉树的中序遍历。
1 迭代法实现前序遍历
前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。只要在找过程中结点保存到栈中,那么返回的时候再从栈依次取出结点,就能得到值,前序执行过程如图:
C语言代码如下:
class TreeNode {
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if (root == nullptr) {
return res;
}
stack<TreeNode*> stk;
TreeNode* node = root;
while ( node != nullptr || !stk.empty()) {
while (node != nullptr) {
res.push_back(node->val);
stk.push(node);
node = node->left;
}
node = stk.top();
stk.pop();
node = node->right;
}
return res;
}
执行结果:
2 迭代法实现中序遍历
再看中序遍历,中序遍历是左中右,先访问的是二叉树左子树的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(在把节点的数值放进res列表中),也就是在结点出栈的时候再处理,而前序遍历则是入栈就处理。中序执行过程如图:
C语言代码如下:
class TreeNode {
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> stk;
while (root != nullptr || !stk.empty()) //中序影响比较大 stk.empty放前4ms,放后0ms
{
while (root != nullptr) {
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
res.push_back(root->val);
root = root->right;
}
return res;
}
执行结果: