递归和非递归俩种方法实现二叉树的前序、中序、后续遍历

来源:互联网 发布:sql点击安装没反应 编辑:程序博客网 时间:2024/04/30 04:02
/*copyright@nciaebupt 转载请注明出处题目:递归和非递归俩种方法实现二叉树的前序遍历分析:按照二叉树前序遍历的定义,无论是访问整棵树还是其子树,均应该遵循先访问根结点,然后访问根结点的左子树,最后访问根结点的右子树的。因为对于一棵树(子树)t,如果t 非空,访问完t 的根结点值后,就应该进入t 的左子树,但此时必须将t 保存起来,以便访问完其左子树后,进入其右子树的访问。yeah,就是这个意思。即在t 处设置一个回溯点,并将该回溯点进栈保存。在整个二叉树前序遍历的过程中,程序始终要做的工作分成俩个部分:1.当前正在处理的树(子树)2.保存在栈中等待处理的部分。注:当栈中元素位于栈顶即将出栈时,意味着其根结点和左子树已访问完成,出栈后,进入其右子树进行访问。*/#include <iostream>#include <cstdlib>#include <stack>struct BSTreeNode{  int value;  int flag;  BSTreeNode * lchild;  BSTreeNode * rchild;};void insertBSTree(BSTreeNode ** root, int value){  BSTreeNode * newNode = new BSTreeNode();  newNode->value = value;  newNode->flag = 0;  newNode->lchild = NULL;  newNode->rchild = NULL;  if((*root) == NULL){    *root = newNode;  }  else{    BSTreeNode * par = NULL;    BSTreeNode * cur = *root;    while(cur != NULL){      par = cur;      if(value >= cur->value){        cur = cur->rchild;      }      else{        cur = cur->lchild;      }    }    if(value >= par->value){      par->rchild = newNode;    }    else{      par->lchild = newNode;    }  }  return;}void createBSTree(BSTreeNode ** root, int * arr, int len){  if(arr == NULL || len < 1) return;  for(int i = 0; i < len; ++i){    insertBSTree(root, arr[i]);  }  return;}void preOrderRecursion(BSTreeNode *root){  if(root != NULL){    std::cout<<root->value<<std::endl;    preOrderRecursion(root->lchild);    preOrderRecursion(root->rchild);  }  return ;}void preOrderNoRecursion(BSTreeNode * root){  if(root == NULL) return;  std::stack<BSTreeNode *> BSTreeNodeStack;  while(root != NULL || !BSTreeNodeStack.empty()){    while(root != NULL){      std::cout<<root->value<<std::endl;      BSTreeNodeStack.push(root);      root = root->lchild;    }    if(!BSTreeNodeStack.empty()){      root = BSTreeNodeStack.top();      root = root->rchild;      BSTreeNodeStack.pop();    }  }  return ;}void inOrderRecursion(BSTreeNode * root){  if(root != NULL){    inOrderRecursion(root->lchild);    std::cout<<"*"<<root->value<<std::endl;    inOrderRecursion(root->rchild);  }  return;}void inOrderNoRecursion(BSTreeNode * root){  if(root == NULL) return;  BSTreeNode * cur = root;  std::stack<BSTreeNode *> BSTreeNodeStack;  while(cur != NULL || !BSTreeNodeStack.empty()){    while(cur != NULL){      BSTreeNodeStack.push(cur);      cur = cur->lchild;    }    if(!BSTreeNodeStack.empty()){      cur = BSTreeNodeStack.top();      BSTreeNodeStack.pop();      std::cout<<"*"<<cur->value<<std::endl;      cur = cur->rchild;    }  }  return;}void lastOrderRecursion(BSTreeNode * root){  if(root != NULL){    lastOrderRecursion(root->lchild);    lastOrderRecursion(root->rchild);    std::cout<<"**"<<root->value<<std::endl;  }}void lastOrderNoRecursion(BSTreeNode * root){  if(root == NULL) return;  std::stack<BSTreeNode *> BSTreeNodeStack;  BSTreeNodeStack.push(root);  BSTreeNode * cur = NULL;  while(!BSTreeNodeStack.empty()){    cur = BSTreeNodeStack.top();    if(cur->flag == 0){      if(cur->rchild != NULL)        BSTreeNodeStack.push(cur->rchild);      if(cur->lchild != NULL)        BSTreeNodeStack.push(cur->lchild);      cur->flag = 1;    }    else{      std::cout<<"**"<<cur->value<<std::endl;      cur->flag = 0;      BSTreeNodeStack.pop();    }  }  return;}int main(int argc, char ** argv){  int arr[] = {2,4,1,6,9,5,7};  int len = sizeof(arr)/sizeof(int);  BSTreeNode * root = NULL;  createBSTree(&root, arr, len);  preOrderRecursion(root);  preOrderNoRecursion(root);  inOrderRecursion(root);  inOrderNoRecursion(root);  lastOrderRecursion(root);  lastOrderNoRecursion(root);  system("pause");  return 0;}

原创粉丝点击