Given a binary tree, return the inorder traversal of its nodes' values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
题意:给出一个二叉树,求出其中序遍历序列。
方法一:中序递归遍历
class Solution {
public:
vector<int>vec;
void inorder(TreeNode *t,int pos){
if(t!=NULL){
if(t->left!=NULL){
inorder(t->left,pos++);
}
vec.push_back(t->val);
if(t->right!=NULL){
inorder(t->right,pos++);
}
}
}
vector<int> inorderTraversal(TreeNode* root){
int pos=0;
inorder(root,pos);
return vec;
}
};
方法二:借助栈实现的中序非递归遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root){
vector<int>st;
stack<TreeNode*>nodes;
while(!nodes.empty()||root!=NULL){
if(root!=NULL){
// 当前节点存在左孩子节点,则将其入栈,处理其左孩子节点
nodes.push(root);
root=root->left;
}else{
// 不存在左孩子节点,将其弹出栈,处理其右孩子节点。
TreeNode* tmp=nodes.top();
nodes.pop();
st.push_back(tmp->val);
root=tmp->right;
}
}
return st;
}
};
完整代码:
#include<stdio.h>
#include<iostream>
#include<stack>
#include<queue>
#include<vector>
#include<map>
using namespace std;
const int INF=-9999999;
//给出树的中序遍历序列 递归建树
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//根据树返回中序序列
class Solution {
public:
vector<int>vec;
void inorder(TreeNode *t,int pos){
if(t!=NULL){
if(t->left!=NULL){
inorder(t->left,pos++);
}
vec.push_back(t->val);
if(t->right!=NULL){
inorder(t->right,pos++);
}
}
}
vector<int> inorderTraversal(TreeNode* root) {
int pos=0;
inorder(root,pos);
return vec;
}
};
//层次遍历建树
void Build(TreeNode *&Tree,vector<int>vec)
{
int pos=0;
Tree=new TreeNode(vec[pos]);
queue<TreeNode*>que;
que.push(Tree);
while(!que.empty()){
TreeNode *tmp=que.front();
que.pop();
if(pos<vec.size()&&vec[++pos]==INF){
tmp->left=NULL;
}else if(pos<vec.size()){
tmp->left=new TreeNode(vec[pos]);
que.push(tmp->left);
}
if(pos<vec.size()&&vec[++pos]==INF){
tmp->right=NULL;
}else if(pos<vec.size()){
tmp->right=new TreeNode(vec[pos]);
que.push(tmp->right);
}
}
}
int main()
{
vector<int>vec;
vec.push_back(1);
vec.push_back(INF);
vec.push_back(2);
vec.push_back(3);
TreeNode *Tree= new TreeNode(vec[0]);
Build(Tree,vec);
Solution CC;
vec=CC.inorderTraversal(Tree);
for(int i=0;i<vec.size();i++)
printf("%d ",vec[i]);
}