文章目录
前言
遍历二叉树(非递归)需要每个结点输出一次,而每个元素只进栈或出栈一次,因此写代码的时候可以将输出与进栈或出栈一起考虑。
实现算法时只考虑树的结点如何按顺序进栈出栈。
一、二叉树中序遍历非递归方法
1.1设计思路
- 依次将p左子树入栈,直至p为空指针(初始p指向根节点)
- 将结点出栈,输出其值,另p指向其右结点,继续重复1
1.2代码
//代码前半部分为参数声明,while为中序遍历实现
int* inorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize=0;
if(root==NULL)
return NULL;
int* ans=(int*)malloc(sizeof(int)*100);
struct TreeNode** stk=(struct TreeNode**)malloc(sizeof(struct TreeNode*)*100);
int top=-1,i=0;
struct TreeNode* p=root;//p为遍历指针
while(p!=NULL || top>-1){
if(p!=NULL){
stk[++top]=p;//左节点入栈
p=p->left;
}
else{
ans[i++]=stk[top]->val;//返回左节点值
*returnSize=i;
p=stk[top--]->right;//转到右节点重复以上步骤
}
}
return ans;
}
- 时间复杂度O( n )
- 空间复杂度O( n )
二、前序遍历方法
2.1设计思路
- 依次将p左子树入栈,入栈前输出p结点值,直至p为空
- 将结点出栈,输出其值,另p指向其右结点,继续