前序非递归遍历
记录下学习二叉树的过程,对二叉树遍历的递归写法不太理解,因此使用非递归写法,模拟递归过程,加深理解对递归过程理解。(学完发现,还是递归香)
#include<bits/stdc++.h>
using namespace std;
typedef struct T{
int val;
struct T *lNode;
struct T *rNode;
}T;
T* initT(T *root,int val){
root = (T*)malloc(sizeof(T));
root->val = val;
root->rNode = NULL;
root->lNode=NULL;
return root;
}
T *BSTRec_Insert(T *root,int val){
if(!root)
{
root = (T*)malloc(sizeof(T));
root->val = val;
root->lNode = NULL;
root->rNode = NULL;
}
else
{
if(val > root->val)
{
root->rNode = BSTRec_Insert(root->rNode,val);
}else if(val < root->val){
root->lNode = BSTRec_Insert(root->lNode,val);
}
}
return root;
}
void preOrder(T* root){
if(root){
printf("%3d",root->val);
preOrder(root->lNode);
preOrder(root->rNode);
}
}
void preOrderNotRec(T* root){
stack<T*> treeNodes;
while(root || !treeNodes.empty()) {
while (root) {
printf("%3d", root->val);
treeNodes.push(root);
root = root->lNode;
}
T *curNode = treeNodes.top();
treeNodes.pop();
if (curNode->rNode) {
root = curNode->rNode;
}
}
}
int main(){
T *root = NULL;
root = initT(root,4);
BSTRec_Insert(root,3);
BSTRec_Insert(root,5);
BSTRec_Insert(root,2);
BSTRec_Insert(root,6);
preOrderNotRec(root);
printf("\n");
preOrder(root);
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/811c02e3a2454dd794436d7fa5b953b2.png#pic_center)
中序非递归(可自行测试)
void InfixOrderNotRec(T* root){
stack<T*> treeNodes;
while(!treeNodes.empty() || root){
while (root){
treeNodes.push(root);
root = root->lNode;
}
T* curNode = treeNodes.top();
printf("This current node = %d\n", curNode->val);
treeNodes.pop();
if (curNode->rNode != NULL) {
root = curNode->rNode;
}
}
}