• 推断二叉树是否平衡


    题目:输入一棵二叉树的根结点,推断该树是不是平衡二叉树。假设某二叉树中随意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
    注:这里不考虑该二叉树是否是二叉排序树
    解决要点:
    1.后序遍历二叉树;
    2.递归。


    核心算法:

    bool isBalanced(pTree pT,int *depth)
    {
    	if(!pT)//參数推断
    	{
    		*depth = 0;
    		return true;
    	}
    	//后序遍历
    	int left,right;
    	if(isBalanced(pT->lChild,&left) && isBalanced(pT->rChild,&right))
    	{
    		int differ = left-right;
    		if(differ >= -1 && differ <= 1)
    		{        //记录深度
    			*depth = (left > right) ? left+1 : right+1;
    			return true;
    		}
    	}
    	return false;
    }
    bool isBalanced(pTree root)//传入二叉树根节点
    {
    	int depth = 0;
    	return isBalanced(root,&depth);
    }

    完整程序:

    /*********************************
    推断二叉树是否是平衡二叉树
    by Rowandjj
    2014/7/13
    *********************************/
    #include<iostream>
    using namespace std;
    typedef struct _NODE_
    {
    	int data;
    	struct _NODE_ *lChild;
    	struct _NODE_ *rChild;
    }TreeNode,*pTree;
    void Create(pTree *pT)
    {
    	int e;
    	cin>>e;
    	if(e != -1)
    	{
    		*pT = (TreeNode*)malloc(sizeof(TreeNode));
    		if(!pT)
    		{
    			exit(-1);
    		}
    		(*pT)->data = e;
    		(*pT)->lChild = NULL;
    		(*pT)->rChild = NULL;
    		Create(&(*pT)->lChild);
    		Create(&(*pT)->rChild);
    	}
    }
    bool isBalanced(pTree pT,int *depth)
    {
    	if(!pT)
    	{
    		*depth = 0;
    		return true;
    	}
    	
    	int left,right;
    	if(isBalanced(pT->lChild,&left) && isBalanced(pT->rChild,&right))
    	{
    		int differ = left-right;
    		if(differ >= -1 && differ <= 1)
    		{
    			*depth = (left > right) ? left+1 : right+1;
    			return true;
    		}
    	}
    	return false;
    }
    bool isBalanced(pTree root)//传入二叉树根节点
    {
    	int depth = 0;
    	return isBalanced(root,&depth);
    }
    void travel(pTree pT)
    {
    	if(pT != NULL)
    	{
    		travel(pT->lChild);
    		travel(pT->rChild);
    		cout<<pT->data<<" ";
    	}
    }
    int main()
    {
    	pTree pT;
    	Create(&pT);
    	travel(pT);
    	cout<<endl;
    	cout<<isBalanced(pT);
    	return 0;
    }




  • 相关阅读:
    C++复制构造函数,类型转换构造函数,析构函数,引用,指针常量和常量指针
    POJ1611(The Suspects)--简单并查集
    最小生成树-Kruskal算法
    POJ1861(Network)-Kruskal
    POJ1979(Red and Black)--FloodFill
    [转]全网最!详!细!tarjan算法讲解
    POJ1573(Robot Motion)--简单模拟+简单dfs
    最小生成树-Prim算法
    POJ3368(Frequent values)--线段树
    POJ3255(Roadblocks)--次短路径
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7115897.html
Copyright © 2020-2023  润新知