二叉树的创建和遍历
来源:互联网 发布:js操作input file 编辑:程序博客网 时间:2024/06/16 18:06
一、二叉树的创建
typedef struct node {int nValue;struct node *lchild;struct node *rchild;}BTNode;
1.递归创建
void RecCreateBiTree(BTNode **pRoot){int nNum;if(pRoot == NULL)return;cin>>nNum;if(nNum == 0)return;//添加节点*pRoot = new BTNode;(*pRoot)->nValue = nNum;(*pRoot)->lchild = NULL;(*pRoot)->rchild = NULL;//处理当前节点的左右RecCreateBiTree(&((*pRoot)->lchild));RecCreateBiTree(&((*pRoot)->rchild));}
2.数组创建
BTNode *ArrToBiTree(int arr[],int nLen){BTNode *pTree = NULL;int i;if(arr == NULL || nLen <=0)return NULL;//根据数组长度创建结构体数组pTree = new BTNode[nLen];//数组元素拷贝 结构数组赋初值for(i = 0;i<nLen;i++){pTree[i].nValue = arr[i];pTree[i].lchild = NULL;pTree[i].rchild = NULL;}//根据左右关系关联for(i = 0;i < nLen/2; i++){if(2*i+1 < nLen)pTree[i].lchild = pTree+2*i+1;if(2*i +2 < nLen)pTree[i].rchild = pTree+2*i+2;}return pTree;}
二、二叉树的遍历
(一)递归遍历
1.前序遍历
void PreOrderTraversal(BTNode *pRoot){if(pRoot == NULL)return;//根cout<<pRoot->nValue<<" ";//左PreOrderTraversal(pRoot->lchild);//右PreOrderTraversal(pRoot->rchild);}
2.中序遍历
void InOrderTraversal(BTNode *pRoot){if(pRoot == NULL)return;//左InOrderTraversal(pRoot->lchild);//根cout<<pRoot->nValue<<" ";//右InOrderTraversal(pRoot->rchild);}
3.后序遍历
void PostOrderTraversal(BTNode *pRoot){if(pRoot == NULL)return;//左PostOrderTraversal(pRoot->lchild);//右PostOrderTraversal(pRoot->rchild);//根cout<<pRoot->nValue<<" ";}
(二)非递归遍历
1.前序遍历
void PreOrderWithoutRec(BTNode* pRoot) { if (pRoot == NULL)return; BTNode* p = pRoot; stack<BTNode*> s; while (!s.empty() || p) { //边遍历边打印,并存入栈中 while (p) { cout << p->nValue<< " "; s.push(p); p = p->lchild; } //当p为空时,说明根和左子树都遍历完了,该进入右子树了 if (!s.empty()) { p = s.top(); s.pop(); p = p->rchild; } } }
2.中序遍历
void InOrderWithoutRec(BTNode* pRoot) { if (pRoot == NULL)return; BTNode* p = pRoot; stack<BTNode*> s; while (!s.empty() || p) { //一直遍历到左子树最下边,边遍历边保存根节点到栈中 while (p) { s.push(p); p = p->lchild; } //当p为空时,说明已经到达左子树最下边,这时需要出栈了 if (!s.empty()) { p = s.top(); s.pop(); cout << p->nValue<< " "; //进入右子树,开始新的一轮左子树遍历 p = p->rchild; } } }
3.后序遍历
void PostOrderWithoutRec(BTNode *pRoot){if (pRoot == NULL)return;BTNode *p = pRoot;stack<BTNode*> s;BTNode *pre = NULL;//pre表示最近一次访问的结点while(!s.empty() || p){//沿着左孩子方向走到最左下 。while(p){s.push(p);p = p->lchild;}//get the top element of the stackp = s.top();//如果p没有右孩子或者其右孩子刚刚被访问过if(p->rchild == NULL || p->rchild == pre){//visit this element and then pop itcout << p->nValue << " ";s.pop();pre = p;p = NULL;}elsep = p->rchild;}}
阅读全文
0 0
- 二叉搜索树的创建和遍历
- 二叉树的创建,遍历和释放
- 简单的二叉树创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 数据结构---二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和前序中序后序遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉查找树的创建和遍历
- 二叉树的递归创建和遍历
- 二叉树的创建和遍历
- 运算符&选择结构
- win下多线程,同步等简单应用
- Cookie
- 使用Java8进行API设计
- prometheus+grafana构建应用监控(四)
- 二叉树的创建和遍历
- 前言的闲话以及第一章的入门(八)
- JDBC连接MySQL数据库由浅入深解析
- CTF web题总结--unserizable
- @线性回归模型
- MySQL性能优化的最佳20+条经验
- Hive 之 Java API 操作
- 随笔 2017.08.29
- PAT (Basic Level) Practise (中文)1013. 数素数 (20)