还是按照之前处理的模式,分别进行二叉树的中序递归遍历和非递归遍历两种方法,首先给出递归遍历的方式:
class Solution {
public:
vector<int> returnTree;
vector<int> inorderTraversal(TreeNode* root) {
if(root!=NULL){
if(root->left!=NULL)
inorderTraversal(root->left);
returnTree.push_back(root->val);
if(root->right!=NULL)
inorderTraversal(root->right);
}
return returnTree;
}
};
中序遍历二叉树的思路很简便,就是按照左、根、右的顺序依次遍历,调用递归函数。下面介绍中序遍历二叉树的非递归思路:
class Solution {
public:
vector<int> returnTree;
stack<TreeNode*> rootNode;
vector<int> inorderTraversal(TreeNode* root) {
if(root!=NULL){
while(root!=NULL||!rootNode.empty()){
while(root!=NULL){
rootNode.push(root);
root=root->left;
}
root=rootNode.top();
returnTree.push_back(root->val);
rootNode.pop();
if(root->right!=NULL)
root=root->right;
else
root=rootNode.top();
}
}
return returnTree;
}
};
这个代码是错误的,问题出在哪里了呢,下面的循环是永远会循环执行的,因为这里的root->right出了点问题,由于这样来来回回就会是会循环,如果出现右-左这样的形式,肯定会出现无限的循环。所以把最后root->right的判断去掉就可以了。
class Solution {
public:
vector<int> returnTree;
stack<TreeNode*> rootNode;
vector<int> inorderTraversal(TreeNode* root) {
if(root!=NULL){
while(root!=NULL||!rootNode.empty()){
while(root!=NULL){
rootNode.push(root);
root=root->left;
}
root=rootNode.top();
returnTree.push_back(root->val);
rootNode.pop();
root=root->right;
}
}
return returnTree;
}
};
思路就是找到左边所有的节点,存入栈,然后拿出来,一个个拿出它(如果有)的右节点,进行同样的操作,而不是如果有右节点才拿出来,应该一视同仁。上面的操作相当于重新导入了循环,当然是不可以的,无论如何都不能进入上面的循环。