数据结构——二叉树(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";
		}
	}
		

}
posted @ 2021-03-11 11:03  lisui  阅读(205)  评论(0编辑  收藏  举报