前序遍历:root,left,right
用栈实现非递归遍历,访问root,将right先存栈,然后left再存栈
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> res;
if (!root) return res;
TreeNode *node=root;
s.push(node);
while(!s.empty())
{
node = s.top();
s.pop();
res.push_back(node->val);
if (node->right) s.push(node->right);
if (node->left) s.push(node->left);
}
return res;
}
中序遍历:left,root,right
还是用栈实现非递归遍历,中序从最左下的子树开始遍历,故需要用栈存节点。访问栈顶节点,然后指向当前节点的右节点,对右节点重复上述流程。
还是代码说的清楚
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
TreeNode *node=root;
vector<int> res;
while(!s.empty()||node)
{
while(node)
{
s.push(node);
node=node->left;
}
node = s.top();
s.pop();
res.push_back(node->val);
node=node->right;
}
return res;
}
后序遍历:left,right,root
可以当成前序遍历的修改版本,先按照root,right,left方式遍历,然后逆序输出遍历结果即后序遍历结果。
leetcode这题标记为hard而且收费才能刷~代码就不写了