前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++实现二叉树

C++实现二叉树

作者头像
对弈
发布2019-09-04 15:52:43
1.1K1
发布2019-09-04 15:52:43
举报
文章被收录于专栏:用户3029758的专栏
代码语言:javascript
复制
//二叉树.cpp
#include "stdafx.h"
#include<iostream>
#include<cstdlib>
#include <ctime>
#include<list>
using namespace std;
struct node
{
int data;
node * father;
node * lchild;
node * rchild;
};


class tree
{
private:
node * root;//根节点
public:
tree();
~tree();
void insert(int data);
node * findNode(int data);
void preOrder(node *p);//前
void inOrder(node *p);//中
void lastOrder(node *p);//后
void clear(node *p);//清空树,即删除整棵树
node* getRoot();
void levelOrder();//层次遍历
void deleteByData(int data);//删除节点(较复杂)
};


tree::tree()
{
root = nullptr;
}
tree::~tree()
{
clear(root); 
root = nullptr;
}
void tree::insert(int data)
{
if (root == nullptr)//是否是空树
{
root = new node;
root->data = data;
root->lchild = root->rchild = nullptr;
}
else
{
node *p, *q;
p = root;
while (true)
{
if (p->data <= data)
{
if (p->rchild == nullptr)
{
p->rchild = new node;
p->rchild->lchild = p->rchild->rchild = nullptr;
p->rchild->data = data;
break;
}
p = p->rchild;
}
else
{
if (p->lchild == nullptr)
{
p->lchild = new node;
p->lchild->lchild = p->lchild->rchild = nullptr;
p->lchild->data = data;
break;
}
p = p->lchild;
}
}
}
}
node * tree::findNode(int data)
{
node *p = root;
while (p != nullptr)
{
if (p->data == data)
break;
else if (p->data < data)
p = p->rchild;
else p = p->lchild;
}
return p;
}
void tree::preOrder(node *p)//前
{
if (p != nullptr)
{
cout << p->data << '\t';
preOrder(p->lchild);
preOrder(p->rchild);
}
}
void tree::inOrder(node *p)//中
{
if (p != nullptr)
{
inOrder(p->lchild);
cout << p->data << '\t';


inOrder(p->rchild);
}
}
void tree::lastOrder(node *p)//后
{
if (p != nullptr)
{
lastOrder(p->lchild);
lastOrder(p->rchild); cout << p->data << '\t';
}
}
void tree::clear(node *p)
{
if (p != nullptr)
{
clear(p->lchild);
clear(p->rchild);
p = nullptr;
}
}
node* tree::getRoot()
{
return root;
}
void tree::levelOrder()
{
list<node*>lis;
lis.push_back(root);
node *p;
while (lis.empty() == 0)
{
p = lis.front();
if (p != nullptr)
{
lis.push_back(p->lchild);
lis.push_back(p->rchild);
}
cout << p->data << '\t';
}
lis.pop_front();//出队
}
void tree::deleteByData(int data)
{
node *p = findNode(data);//查找
if (p == nullptr)return;
else if (p == root)
{
if (root->lchild == nullptr&&root->rchild == nullptr)
{
delete root;
root = nullptr;
}
}
else if (root->lchild == nullptr)//左边为空右边不为空
{
root = root->rchild;
delete p;
}
else if (root->rchild == nullptr)//右边为空左边不为空
{
root = root->lchild;
delete p;
}
else
{
node* q = root->lchild;
while (q->rchild != nullptr)
{
q = q->rchild;
}//q指向最大的节点
//将这个节点拿下来 root代替
q->father->rchild = nullptr;
q->father = root->father;
q->lchild = root->lchild;
q->rchild = root->rchild;
root = q;
delete root;
}




}




int _tmain(int argc, _TCHAR* argv[])
{
tree mytree;
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++)
{
mytree.insert(rand() % 100);
}


cout << "前序遍历:"<<endl ;
mytree.preOrder(mytree.getRoot());
cout << endl;


cout << "中序遍历:" << endl;
mytree.inOrder(mytree.getRoot());
cout << endl;


cout << "后序遍历:" << endl;
mytree.lastOrder(mytree.getRoot());
cout << endl;


mytree.levelOrder();
cout << endl;


system("pause");
return 0;
}

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-47/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档