二叉树的中序遍历非递归算法(数据结构书本上的原算法)
使用C++的stack的pop()方法时,需要注意其删除栈顶元素,但不返回其值
gcc中出现了“void value not ignored as it ought to be”错误,
原因是你使用的一个函数的返回值类型是void,而你有对它进行了赋值处理。
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> res;
if(root == NULL) return res;
TreeNode *tmp;
stack<TreeNode *> st;
st.push(root);
while(!st.empty()){
while(st.top()){ //一路向左
st.push(st.top()->left);
}
st.pop(); //空指针出栈
if(!st.empty()){
tmp = st.top();
st.pop();
res.push_back(tmp->val);
st.push(tmp->right);
}
}
}
};</span></span>
discuss里面看到的另外一种非递归解法:
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> vector;
if(!root) return vector;
stack<TreeNode *> stack;
stack.push(root);
while(!stack.empty())
{
TreeNode *pNode = stack.top();
if(pNode->left)
{
stack.push(pNode->left);
<strong><span style="color:#ff0000;">pNode->left = NULL; //这句一定要有,否则会重复入栈,出现memory limit exceed</span></strong>
}
else
{
vector.push_back(pNode->val);
stack.pop();
if(pNode->right)
stack.push(pNode->right);
}
}
return vector;
}
};</span></span>
最后来一个简单的递归算法:
<span style="font-family:Microsoft YaHei;font-size:14px;">/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> res;
helper(root,res);
return res;
}
void helper(TreeNode *node,vector<int> &res){ <strong><span style="color:#ff0000;">//res使用引用参数</span></strong>
if(node == NULL) return;
helper(node->left,res);
res.push_back(node->val);
helper(node->right,res);
}
};</span>