二叉树的操作--递归与非递归
来源:互联网 发布:win10网络连接图标消失 编辑:程序博客网 时间:2024/05/29 06:55
由于此前已对二叉树介绍过,在此便不多做解释;全是递归操作,先左后右;
创建一个变量:
BinaryTreeNode<T>* _pRoot;
以下是操作是创建树
void _CreateTree(Node*& pRoot, const T array[], size_t size, size_t& index, const T& invalid) //创建一个树 { if(index<size&&invalid!=array[index]) { pRoot=new Node(array[index]); _CreateTree(pRoot->_pLeft,array,size,++index,invalid); _CreateTree(pRoot->_pRight,array,size,++index,invalid); } }
销毁树
void _DestroyTree(Node* &pRoot) //销毁树 { Node* temp=pRoot; if(pRoot==NULL) { return; } _DestroyTree(temp->_pLeft); _DestroyTree(temp->_pRight); delete temp; temp=NULL; }
前序遍历树
void _PreOrder(Node* pRoot) //前序遍历 { Node* temp=pRoot; if(temp==NULL) { return; } cout<<temp->_data<<" ";//访问跟结点 _PreOrder(temp->_pLeft);//递归算法访问左结点 _PreOrder(temp->_pRight);//递归算法访问右结点 }
中序遍历树
void _InOrder(Node* pRoot) //中序遍历 { Node* temp=pRoot; if(temp==NULL) { return; } _InOrder(temp->_pLeft);//递归算法访问左结点 cout<<temp->_data<<" ";//访问跟结点 _InOrder(temp->_pRight);//递归算法访问右结点 }
后序遍历结点
void _PostOrder(Node* pRoot) //后序遍历 { Node* temp=pRoot; if(temp==NULL) { return; } _PostOrder(temp->_pLeft);//递归算法访问左结点 _PostOrder(temp->_pRight);//递归算法访问右结点 cout<<temp->_data<<" ";//访问跟结点 }
某结点的双亲结点
Node* _GetParent(Node* pRoot, Node* x) { if(x==pRoot||x==NULL||NULL==pRoot) { return NULL; } if(x==pRoot->_pLeft||x==pRoot->_pRight) { return pRoot; } if(x!=pRoot) { _GetParent(pRoot->_pLeft,x); _GetParent(pRoot->_pRight,x); } }
求树的高度
size_t _Height(Node* pRoot) { if(pRoot==NULL) return 0; if(NULL==pRoot->_pLeft&&NULL==pRoot->_pRight) return 1; else { size_t leftHight=_Height(pRoot->_pLeft); size_t rightHight=_Height(pRoot->_pRight); if(leftHight>rightHight) return leftHight+1; else return rightHight+1; } }
树的层数
size_t _GetKLevelNode(Node* pRoot, size_t k) { if(pRoot==NULL||k<1||k>_Height(pRoot)) return 0; if(NULL==pRoot->_pLeft&&NULL==pRoot->_pRight) return 1; return _GetKLevelNode(pRoot->_pLeft,k-1)+ _GetKLevelNode(pRoot->_pRight,k-1); }
树的叶子节点的个数
size_t _GetLeefNode(Node* pRoot) { if(pRoot==NULL) return 0; if(NULL==pRoot->_pLeft&&NULL==pRoot->_pRight) return 1; return _GetLeefNode(pRoot->_pLeft)+ _GetLeefNode(pRoot->_pRight); }
拷贝构造函数
Node* _CopyBinaryTree(Node* pRoot) //复制树 { if(pRoot==NULL) { return NULL; } Node* pNewRoot=new Node(pRoot->_data); pNewRoot->_pLeft=_CopyBinaryTree( pRoot->_pLeft); pNewRoot->_pRight=_CopyBinaryTree( pRoot->_pRight); return pNewRoot; }
在树中寻找某个结点
Node* _Find(Node* pRoot, const T& value) { Node* pCur=pRoot; Node* P=NULL; if(pCur==NULL) { return NULL; } if(value==pCur->_data) { P=pCur; } else { P=_Find(pCur->_pLeft,value); if(P==NULL) P=_Find(pCur->_pRight,value); } return P; }
以下是非递归算法:
非递归前序遍历算法:
void _PreOrder_nor(Node* pRoot) { stack<Node*> s; Node* p=pRoot; while(!s.empty()||p!=NULL) { while(p) { s.push(p); cout<<p->_data<<" "; p=p->_pLeft; } p=s.top(); s.pop(); p=p->_pRight; } }
非递归中遍历算法:
//非递归中序遍历:访问左子树-->根-->右子树 void _InOrder_nor(Node* pRoot) { stack<Node*> s; Node* p=pRoot; while(!s.empty()||p!=NULL) { while(p) { s.push(p); p=p->_pLeft; } p=s.top(); s.pop(); cout<<p->_data<<" "; p=p->_pRight; } }
非递归后序遍历算法:
// 非递归后续遍历:访问左子树-->访问右子树-->访问根节点 void _PostOrder_nor(Node* pRoot) { if(NULL==pRoot) //空树 return; Node* PCur=pRoot; //当前结点为根节点 Node* Prev=NULL; //已经访问的结点 stack<Node*> s; while(!s.empty()||PCur) { while(PCur) //把左孩子依次压栈 { s.push(PCur); PCur=PCur->_pLeft; } //当前结点为NULL Node* top=s.top(); //指向栈顶 if(NULL==top->_pRight||Prev==top->_pRight) //栈顶元素没有右孩子,或者右孩子已经被访问过 { cout<<top->_data<<""; Prev = top; //已经访问的结点 s.pop(); } else PCur=top->_pRight; } }
阅读全文
1 0
- 二叉树的操作--递归与非递归
- 二叉树的递归与非递归
- 二叉树的递归与非递归
- 二叉树的递归与非递归
- 二叉查找树的非递归操作
- 二叉树的非递归遍历操作
- 二叉树的遍历 非递归操作
- 二叉树非递归的操作
- ~二叉树的非递归遍历操作~
- 二叉树的遍历--非递归操作
- 二叉树的常用操作(创建、先中后序递归与非递归遍历、层序遍历)
- 遍历二叉树的各种操作(递归与非递归遍历)
- 二叉树 递归 与 非递归 遍历
- 递归与非递归二叉树遍历
- 二叉树递归与非递归遍历
- 递归与非递归实现二叉树
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- SQLite
- pixfllow光流传感器数据获取及悬停程序编写
- Android的ROS开发环境配置(Android+ROS+rosjava+android_core)
- mysql关于包含表情昵称字段保存数据库失败问题处理
- 【数据压缩】Exp03.HUffman_Coding霍夫曼编码及其编码效率分析
- 二叉树的操作--递归与非递归
- docker运行 jenkins 重点在 -v 和-u jenkins内部文件操作
- 11-散列2 Hashing (25分)
- Java容器类源码学习笔记之ArrayList
- Linux 系统目录结构
- C++简单选择排序
- java servlet 与前端json数据传输ajax、jquery
- android中Parcelable接口的使用
- “Naive”贝叶斯算法 —— 朴素贝叶斯(Naive Bayesian)算法