c++树及树与二叉树的转换
此算法中的树结构为“左儿子有兄弟链接结构”
在这样的一个二叉树中,一个节点的左分支是他的大儿子节点,右分支为他的大兄弟节点。
这里讲的树有递归前根,中根,后根遍历,插入节点,插入兄弟节点,查找结点,释放内存这些功能。
重点说一下查找节点这一算法:
pSTreeNode CTree::Search( pSTreeNode pNode, TreeDataType Value )
{
if ( pNode == NULL )
return NULL;
if ( pNode->data == Value )
return pNode;
if ( pNode->pFirstChild == NULL && pNode->pNextBrother == NULL )
return NULL;
else
{
if ( pNode->pFirstChild != NULL ) //首先判断根节点的左儿子节点是否为空,若不为空,通过引入指针来寻找节点
{
pSTreeNode pNodeTemp = Search( pNode->pFirstChild, Value );
if ( pNodeTemp != NULL )
return pNodeTemp;
else
{
return Search( pNode->pNextBrother, Value );
}
}
else //否则在根节点的右兄弟节点中寻找
return Search( pNode->pNextBrother, Value );
}
}
完整代码如下:
#include <iostream>
using namespace std;
typedef struct STreeNode* pSTreeNode;
typedef int TreeDataType;
//定义结构体
struct STreeNode
{
TreeDataType data;
pSTreeNode pFirstChild;
pSTreeNode pNextBrother;
//结构体构造函数
STreeNode( TreeDataType Value )
{
data = Value;
pFirstChild = NULL;
pNextBrother = NULL;
}
};
//定义类
class CTree
{
public:
CTree();
CTree( TreeDataType Value );
~CTree();
public:
void Insert( TreeDataType parentValue, TreeDataType Value ); // parentValue:该点的父亲节点;Value:该点的值
void InsertBrother( pSTreeNode pParentNode, TreeDataType Value );
pSTreeNode Search( pSTreeNode pNode, TreeDataType Value );
void Preorder( pSTreeNode pNode ); // 前序遍历
void Inorder( pSTreeNode pNode ); // 中序遍历
void postorder( pSTreeNode pNode ); // 后序遍历
void FreeMemory( pSTreeNode pNode ); // 释放内存
public:
pSTreeNode pRoot;
};
//构造函数
CTree::CTree()
{
pRoot = NULL;
}
//构造函数
CTree::CTree( TreeDataType Value )
{
pRoot = new STreeNode( Value );
}
//析构函数
CTree::~CTree()
{
if (pRoot == NULL )
return;
FreeMemory( pRoot );
}
//释放内存
void CTree::FreeMemory( pSTreeNode pNode )
{
if ( pNode == NULL )
return;
if ( pNode->pFirstChild != NULL )
FreeMemory( pNode->pFirstChild );
if ( pNode->pNextBrother != NULL )
FreeMemory( pNode->pNextBrother );
delete pNode;
pNode = NULL;
}
//插入节点
void CTree::Insert( TreeDataType parentValue, TreeDataType Value )
{
if ( pRoot == NULL )
return;
pSTreeNode pFindNode = Search( pRoot, parentValue );
if ( pFindNode == NULL )
return;
if ( pFindNode->pFirstChild == NULL )
{
pFindNode->pFirstChild = new STreeNode( Value );
return;
}
else
{
InsertBrother( pFindNode->pFirstChild, Value );
return;
}
}
//插入右兄弟节点
void CTree::InsertBrother( pSTreeNode pBrotherNode, TreeDataType Value )
{
if ( pBrotherNode->pNextBrother != NULL )
InsertBrother( pBrotherNode->pNextBrother, Value );
else
{
pBrotherNode->pNextBrother = new STreeNode( Value );
return;
}
}
//查找函数
pSTreeNode CTree::Search( pSTreeNode pNode, TreeDataType Value )
{
if ( pNode == NULL )
return NULL;
if ( pNode->data == Value )
return pNode;
if ( pNode->pFirstChild == NULL && pNode->pNextBrother == NULL )
return NULL;
else
{
if ( pNode->pFirstChild != NULL )
{
pSTreeNode pNodeTemp = Search( pNode->pFirstChild, Value );
if ( pNodeTemp != NULL )
return pNodeTemp;
else
{
return Search( pNode->pNextBrother, Value );
}
}
else
return Search( pNode->pNextBrother, Value );
}
}
//前序遍历
void CTree::Preorder( pSTreeNode pNode )
{
if (pNode == NULL)
return;
cout << " " << pNode->data << " ";
Preorder( pNode->pFirstChild );
Preorder( pNode->pNextBrother );
}
//中序遍历
void CTree::Inorder( pSTreeNode pNode )
{
if ( pNode == NULL )
return;
Inorder( pNode->pFirstChild );
cout << " " << pNode->data << " ";
Inorder( pNode->pNextBrother );
}
//后序遍历
void CTree::postorder( pSTreeNode pNode )
{
if ( pNode == NULL )
return;
postorder( pNode->pFirstChild );
postorder( pNode->pNextBrother );
cout << " " << pNode->data << " ";
}
//主函数
int main()
{
CTree* pTree = new CTree( 1 );
pTree->Insert( 1, 2 );
pTree->Insert( 1, 3 );
pTree->Insert( 1, 4 );
pTree->Insert( 1, 5 );
pTree->Insert( 1, 6 );
pTree->Insert( 1, 7 );
pTree->Insert( 4, 8 );
pTree->Insert( 5, 9 );
pTree->Insert( 5, 10 );
pTree->Insert( 6, 11 );
pTree->Insert( 6, 12 );
pTree->Insert( 6, 13 );
pTree->Insert( 10, 14 );
pTree->Insert( 10, 15 );
cout << "前序遍历:" << endl;
pTree->Preorder( pTree->pRoot );
cout << endl;
cout << "中序遍历:" << endl;
pTree->Inorder( pTree->pRoot );
cout << endl;
cout << "后序遍历:" << endl;
pTree->postorder( pTree->pRoot );
cout << endl;
delete pTree;
pTree = NULL;
return 0;
}
c++树及树与二叉树的转换的更多相关文章
- 哈夫曼树【最优二叉树】【Huffman】
[转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...
- 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)
树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- 以AVL树为例理解二叉树的旋转(Rotate)操作
树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈 ...
- 数据结构(一)二叉树 & avl树 & 红黑树 & B-树 & B+树 & B*树 & R树
参考文档: avl树:http://lib.csdn.net/article/datastructure/9204 avl树:http://blog.csdn.net/javazejian/artic ...
- C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解
笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func& ...
- php数据结构课程---5、树(树的 存储方式 有哪些)
php数据结构课程---5.树(树的 存储方式 有哪些) 一.总结 一句话总结: 双亲表示法:data parent:$tree[1] = ["B",0]; 孩子表示法:data ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- 【查找结构5】多路查找树/B~树/B+树
在前面专题中讲的BST.AVL.RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关.那么降低树高自然对查找效率是有所帮助的.另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
随机推荐
- python3基础04(requests常见请求)
#!/usr/bin/env python# -*- coding:utf-8 -*- import requestsimport jsonimport reimport urllib3from ur ...
- 8. String to Integer
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- linux下安装和卸载mysql
卸载: 1 . rpm -qa | grep -i mysql命令查看已经安装过的组件. 2. 使用yum -y remove命令卸载已经安装的MySQL组件,使用下面的命令,对于上面已经安装 ...
- 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)
点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...
- 在ListBox控件间交换数据
实现效果: 知识运用: ListBox控件的SelectedItem属性 //获取或设置ListBox控件中当前选定的数据项 public Object SelectedItem{ get;set; ...
- sessionStorage 和 localStorage
html5 中的 web Storage 包括了两种存储方式:sessionStorage 和 localStorage. sessionStorage 用于本地存储一个会话(session)中的数据 ...
- 漫谈 Clustering (2): k-medoids
上一次我们了解了一个最基本的 clustering 办法 k-means ,这次要说的 k-medoids 算法,其实从名字上就可以看出来,和 k-means 肯定是非常相似的.事实也确实如此,k-m ...
- 利用原生JS实现类似浏览器查找高亮功能(转载)
利用原生JS实现类似浏览器查找高亮功能 在完成 Navify 时,增加一个类似浏览器ctrl+f查找并该高亮的功能,在此进行一点总结: 需求 在.content中有许多.box,需要在.box中找出搜 ...
- 2.3.3 zerosum 和为零
#include<bits/stdc++.h> using namespace std; ],a; ]={' ','+','-'}; void out() { ;i<a;i++) c ...
- git线上线下冲突
今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...