zoukankan      html  css  js  c++  java
  • 数据结构——二叉树(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 << "创建成功!
    ";
    }
    

    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 << "空二叉树!
    ";
    		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) << "
    ";
    		}
    	}
    		
    
    }
    
  • 相关阅读:
    【CF1027C】Minimum Value Rectangle(贪心,数学)
    【CF1027B】Numbers on the Chessboard(数学)
    【CF1027A】Palindromic Twist(模拟)
    【CF1023C】Bracket Subsequence(模拟)
    【CF1023B】Pair of Toys(解方程)
    【CF1023A】Single Wildcard Pattern Matching(模拟)
    【CF1020C】Elections(贪心)
    【CF1020B】Badge(模拟)
    【CF1020A】New Building for SIS(签到)
    【CF1017D】The Wu(状压前缀和)
  • 原文地址:https://www.cnblogs.com/kadcyh/p/14516579.html
Copyright © 2011-2022 走看看