数据结构之树的创建及非递归遍历
来源:互联网 发布:组成数据的基本单位 编辑:程序博客网 时间:2024/06/05 08:27
1,树的递归创建
创建树的类,先创建struct TreeNode的节点
对于 char* ch=”abd###ce##f”的字符串创建树,遇到#为空
2,特殊情况:记得对节点指针的有效性判断
template<class T>struct TreeNode{ TreeNode() {} TreeNode(T value) { data = value; LeftTree = NULL; RightTree = NULL; } T data; TreeNode<T> *LeftTree; TreeNode<T> *RightTree;};template<class T>class Tree{public: Tree() :_pRoot(NULL) {} Tree(T* arr, size_t size) :_pRoot(NULL) { size_t index = 0; CreatTree(_pRoot, arr, size, index); } Tree(const Tree<T>& p) { if (p._pRoot != NULL) _pRoot = CopyTree(p._pRoot); } Tree<T>& operator=(Tree<T>& p) { if (&p != this) { if (_pRoot != NULL) { Destory(_pRoot); } _pRoot = CopyTree(p._pRoot); } return *this; } ~Tree() { if (_pRoot != NULL) { Destory(_pRoot); } } } void CreatTree(TreeNode<T> *& pRoot, T *arr, size_t size, size_t &index) { if (pRoot == NULL && index<size && arr[index] != '#') { pRoot = new TreeNode<T>(arr[index]); CreatTree(pRoot->LeftTree, arr, size, ++index); CreatTree(pRoot->RightTree, arr, size, ++index); } } TreeNode<T> *& CopyTree(TreeNode<T>* p) { TreeNode<T> * newpRoot; if (p != NULL) { newpRoot = new TreeNode<T>(p->data); newpRoot->LeftTree = CopyTree(p->LeftTree); newpRoot->RightTree = CopyTree(p->RightTree); return newpRoot; } } void Destory(TreeNode<T> *& pRoot) { if (pRoot != NULL) { Destory(pRoot->LeftTree); Destory(pRoot->RightTree); delete pRoot; pRoot = NULL; } }
2树的非递归遍历
void RootFrontTree() { std::stack<TreeNode<T>*> s; TreeNode<T>* pCur = _pRoot; s.push(pCur); while (!s.empty()) { TreeNode<T>* newTop = s.top(); cout << newTop->data; s.pop(); if (newTop->RightTree != NULL) s.push(newTop->RightTree); if (newTop->LeftTree != NULL) s.push(newTop->LeftTree); } } void RootMidTree() { std::stack<TreeNode<T>*> s; TreeNode<T>* pCur = _pRoot; while (!s.empty() || pCur != NULL) //当把根的左子树遍历完,根节点也pop出来时,栈可能为空 { while (pCur) //找到最左边的:最左边的没左子树 { s.push(pCur); pCur = pCur->LeftTree; } TreeNode<T>* newTop = s.top(); if (newTop->RightTree == NULL) { cout << newTop->data; s.pop(); } else { cout << newTop->data; pCur = newTop->RightTree; s.pop(); } } } void RootBackTree() { std::stack<TreeNode<T>*> s; TreeNode<T>* pCur = _pRoot; TreeNode<T>* per = NULL; while (!s.empty() || pCur != NULL) //刚进时为空 { while (pCur) //找到最左边的:最左边的没左子树 { s.push(pCur); pCur = pCur->LeftTree; } TreeNode<T>* newTop = s.top(); if (newTop->RightTree == NULL || per == newTop->RightTree)//打印1.没右子树 2.有右子树,但已经刚被打印过了 { cout << newTop->data; per = newTop; s.pop(); } else { pCur = newTop->RightTree; } } }
阅读全文
0 0
- 数据结构之树的创建及非递归遍历
- 二叉树的创建及递归和非递归遍历
- 数据结构之二叉树的递归创建、递归遍历
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- 数据结构之二叉树的非递归遍历
- 数据结构之二叉树的非递归遍历
- 数据结构-----创建/递归非递归遍历二叉树
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- SVM(Support Vector Machine)
- 231. Power of Two
- 三分板子 zoj 3203
- 线程(从创建到消亡的过程)
- openstack源码解析之虚机创建
- 数据结构之树的创建及非递归遍历
- 交换排序
- RecyclerView添加分割线的简便方法
- ajaxfileupload.js目前功能最全版本(多文件、异常处理等),顺便解决只能上传一次的BUG(非live绑定)
- 一份呕心沥血整理的bug list
- Hbase集群安装配置
- 多线程、同步代码块
- opencv cvMat数据类型
- linux初学者-pxe装机篇