树的遍历
leetcode 144.二叉树的前序遍历
leetcode 94.二叉树的中序遍历
leetcode 145.二叉树的后序遍历
leetcode 102.二叉树的层次遍历
树与递归密切相关,同时递归与栈密切相关
递归实现
vector<int> res; //私有数据存储遍历数据
vector<int> preorderTraversal(TreeNode* root) {
if(root){
//res.push_back(root->val); //前序遍历
preorderTraversal(root->left);
//res.push_back(root->val); //中序遍历
preorderTraversal(root->right);
//res.push_back(root->val); //后序遍历
}
return res;
}
用栈,迭代实现
前序
stack S
rt= root;
while(rt || S不空){
while(rt){
访问rt节点;
rt的右子树入S;
rt = rt的左子树;
}
rt = S栈顶弹出;
}
中序
stack S;
rt= root;
while(rt || S不空){
while(rt){ //遍历到左下角
rt入S;
rt = rt的左子树;
}
rt = S.top 出栈;
访问rt; //rt的左子树已经访问完
rt = rt的右子树; //递归访问右子树
}
后序
方法一:类似前序遍历,根->右->左
逆序
stack S;
rt= root;
while(rt || S不空){
while(rt){
访问rt节点;
rt的左子树入S;
rt = rt的右子树;
}
rt = S栈顶弹出;
}
结果序列逆序;
方法二:
stack S;
map<节点,True/False> : 节点标记;
while(rt || S不空){ //移动到左下角,左子树访问完
while(rt){
rt入S;
rt = rt的左子树;
}
while(S不空 且 map[S.top] = True){ //右子树访问完时,访问根节点
访问S.top;
S.top出S;
}
if(S不空){ //访问右子树
rt = S.top 的右子树;
T[S.top] = True;
}
}