此算法中的树结构为“左儿子有兄弟链接结构”

在这样的一个二叉树中,一个节点的左分支是他的大儿子节点,右分支为他的大兄弟节点。

这里讲的树有递归前根,中根,后根遍历,插入节点,插入兄弟节点,查找结点,释放内存这些功能。

重点说一下查找节点这一算法:

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++树及树与二叉树的转换的更多相关文章

  1. 哈夫曼树【最优二叉树】【Huffman】

    [转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...

  2. 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)

    树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...

  3. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  4. 以AVL树为例理解二叉树的旋转(Rotate)操作

    树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈 ...

  5. 数据结构(一)二叉树 & avl树 & 红黑树 & B-树 & B+树 & B*树 & R树

    参考文档: avl树:http://lib.csdn.net/article/datastructure/9204 avl树:http://blog.csdn.net/javazejian/artic ...

  6. C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解

    笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func& ...

  7. php数据结构课程---5、树(树的 存储方式 有哪些)

    php数据结构课程---5.树(树的 存储方式 有哪些) 一.总结 一句话总结: 双亲表示法:data parent:$tree[1] = ["B",0]; 孩子表示法:data ...

  8. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

  9. 【查找结构5】多路查找树/B~树/B+树

    在前面专题中讲的BST.AVL.RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关.那么降低树高自然对查找效率是有所帮助的.另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实 ...

  10. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

随机推荐

  1. 测试MS题

    购物车测试点:  1.界面测试        界面布局.排版是否合理:文字是否显示清晰:不同卖家的商品是否区分明显. 2.功能测试 未登录时: 将商品加入购物车,页面跳转到登录页面,登录成功后购物车数 ...

  2. python 之 BeautifulSoup 常用提取

    一.bs4信息提取后返回的数据类型 soup.find('tbody') ---> 返回结构是一个bs4.element.Tag soup.find('tbody').children ---& ...

  3. 关于android界面菜单,project显示问题

    刚用android studio不久,遇到了一个问题:界面菜单project不小心被关掉了,百度各种搜索无结果.我想大多数人都遇到过类似问题,此类问题其实很简单但是对于初学者来说就有点苦恼了.所以在此 ...

  4. 【总结】Oracle sql 中的字符(串)替换与转换

    1.REPLACE 语法:REPLACE(char, search_string,replacement_string) 用法:将char中的字符串search_string全部转换为字符串repla ...

  5. Exception handling 异常处理的本质

    异常处理的本质:状态回滚或者状态维护. https://en.wikipedia.org/wiki/Exception_handling In general, an exception breaks ...

  6. 【51nod1705】七星剑(成环DP)

    点此看题面 大致题意: 你要把一把剑从0星升至7星,有n颗宝石供你选择,第i颗宝石的价值是c[i],用第i颗宝石将剑从k-1星升至k星的成功率是prob[k][i],而失败后会掉lose[k][i], ...

  7. 一些常用的集合工具的代码块(缓慢更新XD,更新了多属性过滤:) )

    更新记录 虽然经常放鸽子,但是还是要记录一下更新 2017.8.30 更新了listToMap的方法,现在可以指定多个属性进行分组了,例如你要指定一个学生集合,按照名字和年龄相同的放在一组,现在只要调 ...

  8. IPV6验证正则表达式

    验证ipv6的正则表达式: 例:fe80::ec61:c1d1:9827:82be%13 \s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9 ...

  9. 1043: [HAOI2008]下落的圆盘

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1725  Solved: 743[Submit][Status][Discuss] Descripti ...

  10. SpringMVC 多视图解析器 跳转问题

    在SpringMVC的配置文件中加入以下配置: <!--  下面红色的配置必须要在--> <mvc:default-servlet-handler /> <bean id ...