数据结构——二叉树(C/C++)
目录
一、二叉树基础
1.1、二叉树节点信息表示
在计算机表示一颗二叉树可以有很多方式,而我采用左右孩子链表表示法。节点信息定义如下:
#define MYDATA int
//二叉树节点
struct NODE {
MYDATA data;
struct NODE *lchild,*rchild;
};
1.2、创建一颗二叉树
1.2.1 前序遍历创建二叉树
创建规则:。
将待创建二叉树的节点信息,按照前序遍历的顺序存放在数组中。待要创建二叉树的时候在传入。数组的的节点信息必须构成一颗满二叉数,且每个叶子节点信息以0结束。
create_node(NODE* &term,char *data_,MYDATA &pos_)
{
try{
term = new NODE;
}catch(exception &e){
throw e; //再次甩出异常
}
term->num =data_[pos_] ;
term->lchild = NULL;
term->rchild = NULL;
}
void treeA(NODE* &root,char *data,MYDATA &pos)
{
try
{
pos+=1;
create_node(root,data,pos);
}catch(exception e)
{
cout<<"Error:"<<e.what()<<endl;
return;
}
if(root->num == 0)
{
delete root; //需要判断叶子节点的出现
root = NULL;
return;
}
treeA(root->lchild,data,pos);
treeA(root->rchild,data,pos);
}
备注:z这里参数,用的是传引用的方式,提高效率。
1.2.2 层序遍历创建二叉树
创建规则:利用层序遍历的方式将待建立二叉树的节点信息放入数组中。且以0作为结束。
bool eva(NODE* &term,MYDATA ch)
{
if (ch == 0)
{
return false;
}
term = new NODE;
term->data = ch;
term->lchild = NULL;
term->rchild = NULL;
return true;
}
//////////////////////////////////////////
//参数:root是定义的全局变量,已经申请空间
//////////////////////////////////////////
void Btree::createBTree(const MYDATA *data)
{
int index = 1;//索引
std::queue<NODE*> q;//队列
if (data[0] == 0)//空二叉树返回
{
delete root;
root = NULL;
return;
}
//二叉树根节点赋值
root->data = data[0];
q.push(root);
while (true)
{
NODE *term = NULL;
term = q.front();//出栈
q.pop();
if (!eva(term->lchild, data[index])) break; //二叉树创建停止
++index;
q.push(term->lchild);
if (!eva(term->rchild, data[index])) break; //二叉树创建停止
++index;
q.push(term->rchild);
}
std::cout << "创建成功!\n";
}
1.3、遍历二叉树
1.3.1 前序遍历
////////////////////////////
//前序遍历
////////////////////////////
void ftt(NODE *t)
{
if (t == NULL)
{
return;
}
std::cout << t->data << " ";
ftt(t->lchild);
ftt(t->rchild);
}
void Btree::FTT()
{
NODE* term = root;
ftt(term);
}
1.3.2中序遍历
//////////////////////////////////
//中序建立二叉树
/////////////////////////////////
void mtt(NODE *t)
{
if (t == NULL)
{
return;
}
mtt(t->lchild);
std::cout << t->data << " ";
mtt(t->rchild);
}
void Btree::MTT()
{
NODE* t = root;
mtt(t);
}
1.3.3层序遍历
void Btree::LTT()
{
NODE* _root = root;
if (_root == NULL)
{
std::cout << "空二叉树!\n";
return;
}
std::queue<NODE *> q;
q.push(_root);
while (!q.empty())//队列非空
{
NODE* term = q.front();
std::cout << term->data << " ";
q.pop();
if (term->lchild != NULL) q.push(term->lchild);
if (term->rchild != NULL) q.push(term->rchild);
}
}
二、二叉数简单题目练习
2.1、将二叉树修改为镜像二叉树
镜像二叉树定义:
核心代码展示:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL)
{
return;
}
TreeNode *t;
t = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = t;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
2.2人字形输出二叉树
void Btree::RTT()
{
NODE *term = root;
int len = 0;//树的深度
std::queue<NODE *> q;//队列
if (term == NULL)
{
return;
}
q.push(term);
while (!q.empty())
{
std::vector<int> res;
int n = q.size();//队列里面的值
for (int k = 0; k < n; k++)
{
NODE * t = q.front();
q.pop();
if (len % 2 == 0)//偶数---想动态数组头插入数据
{
res.push_back(t->data);
}
else
{
res.insert(res.begin(),t->data);
}
if (t->lchild != NULL) q.push(t->lchild);
if (t->rchild != NULL) q.push(t->rchild);
}
++len;
//遍历输出
for (std::vector<int>::iterator it = res.begin(); it < res.end(); ++it)
{
std::cout << "第" << len << "层" << *(it) << "\n";
}
}
}