要对一颗二叉树进行中序遍历,本文分别用递归和非递归的方法进行遍历。
1.递归
中序递归的思路很清晰,对于每个子树,先遍历左子树,再打印根节点值,最后遍历右子树
void inordernum(TreeNode *root,vector<int> &res)
{
if(root==NULL )
return ;
inordernum(root->left ,res);
res.push_back (root->val );
inordernum(root->right ,res);
}
vector<int> inorder(TreeNode *root)
{
vector<int> res;
inordernum (root,res);
return res;
}
2.非递归
非递归虽然使用了栈,但是和递归的思路完全一样,递归函数的入口就是入栈,递归函数结束就是出栈。第一个while循环就是遍历左子树,找到最左边的节点,所有节点入栈就相当于一层层递归。到达最左侧的节点之后,while停止,就好比递归到了最底层的函数。然后读取此时节点的值,然后该元素出栈,相当于返回上一层递归。虽然最后指向了右节点,但是右节点没有入栈,如果它不为空才会入栈,不然退回上一层节点。
vector<int> inorderTraversal(TreeNode* root) {
vector<int > res;
stack<TreeNode *> temp;
while(!temp.empty ()||root!=NULL )
{
while(root!=NULL )
{
temp.push (root );
root=root->left ;
}
if(!temp.empty () )
{
root=temp.top();
res.push_back (root->val );
temp.pop();
root=root->right;
}
}
return res;
}