题目描述
给定一个二叉树,返回它的中序 遍历。
示例:
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
题解思路
//伪代码
//创建一个树的结构体,包含节点值val,左子树右子树,并进行初始化
栈S
p=root;
向量v记录返回的序列;
while(p存在||S非空){
while(p存在){
p入栈S;
p = p的左子树;//当p不是null的时候,就从根节点一直遍历左子树,并将这些节点一次入栈,直到p为空
}
//当p为null后,说明已经遍历到了最底层的左子树节点,则将栈顶弹出,并将该节点的值存入v中
弹出栈顶;
将p的值存进v;
p = p的右子树:
}
返回v;
/**
// * Definition for a binary tree node.
// * 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) {
TreeNode *p = root;
stack<TreeNode *> S;
vector<int> v;
while(p||!S.empty()){
while(p){
S.push(p);
p = p->left;
}
p = S.top();
S.pop();
v.push_back(p->val);
p = p->right;
}
return v;
}
};
附上调试代码:
#include<iostream>
#include<vector>
#include<stdio.h>
#include<stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
TreeNode *construct(string &data, int &i)
{
if (i >= data.size() || data[i] == 'n')
{
i += 2;
return nullptr;
}
string t;
while (i < data.size() && data[i] != ',') t += data[i++];
++i;
TreeNode *n = new TreeNode(atoi(t.c_str()));
n->left = construct(data, i);
n->right = construct(data, i);
return n;
}
TreeNode* deserialize(string data)
{
int i = 0;
return construct(data, i);
}
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> S;
vector<int> v;
TreeNode* rt = root;
while (rt || S.size()) {
while (rt) {
S.push(rt);
rt = rt->left;
}
rt = S.top(); S.pop();
v.push_back(rt->val);
rt = rt->right;
}
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
return v;
}
};
int main()
{
Solution s;
string tree = "1,2,4,8,n,n,9,n,n,5,10,n,n,11,n,n,3,6,12,n,n,13,n,n,7,14,n,n,15,n,n";
TreeNode *root = deserialize(tree);
s.inorderTraversal(root);
return 0;
}
代码执行结果
学习内容
1.vector基本函数实现:void push_back(const T& x):向量尾部增加一个元素X