1. 程式人生 > >如何判斷一棵樹是平衡二叉樹

如何判斷一棵樹是平衡二叉樹

首先,想一下平衡二叉樹的概念。

平衡二叉樹(AVL樹)是滿足下面條件的二叉樹:要麼是一棵空樹,要麼左右子樹都是AVL樹,並且左右子樹的深度之差的絕對值不大於1。由此可知,要判斷一棵樹是不是AVL樹,只要判斷它的左右子樹的深度之差。問題落到了如何求一棵樹的深度上去了。下面使用遞迴的方法求一棵樹的深度:

#include<stdio.h>
#include<math.h>
#include<malloc.h>
typedef struct BTree
{
	int data;
	struct BTree *lchild,*rchild;
}BTree,*Root;
int isAVL(Root root)
{
	if(!root)
                return TRUE;
        int ldepth=getDepth(root->lchild);
        int rdepth=getDepth(root->rchild);
        int abs_depth=abs(ldepth-rdepth);
        printf("ldepth=%d,rdepth=%d\n",ldepth,rdepth);
        return (abs_depth<=1)&&isAVL(root->lchild)&&isAVL(root->rchild);
}
int getDepth(Root root)
{
	int  ldepth,rdepth;
	if(!root)
		return	0;
	else
	{
		rdepth=getDepth(root->rchild);
		ldepth=getDepth(root->lchild);
		return (rdepth>ldepth)?(rdepth+1):(ldepth+1);
	}
}
Root createBTree(int arr[],int len,int i)
{
	Root root;
	if(i>=len||(arr[i]==0))
		return NULL;
//	printf("i=%d,len=%d,arr[i]=%d\n",i,len,arr[i]);
	root=(Root)malloc(sizeof(BTree));
	root->data=arr[i];
	root->lchild=createBTree(arr,len,2*i);
	root->rchild=createBTree(arr,len,2*i+1);

	return root;
}
void destroyBtree()
{

}
int main(void)
{
	int arr[]={0,1,2,3,4,0,0,0};
	//int arr[]={0,1,2,0,4,0,0,0,8};
	int i,depth;
	//Root root=createBTree(arr,9,1);
	Root root=createBTree(arr,8,1);
//	if(root)		printf("ok\n");
	printf("depth=%d",getDepth(root));
	if(isAVL(root))
		printf("是AVL樹\n");
	else
		printf("不是AVL樹");
}

在求深度的程式碼上浪費了很多時間,將我的錯誤貼出來,希望大家不要再犯。
int getDepth(Root root)
{
	int  ldepth,rdepth;
	if(!root)
		return	0;
	else if(!root->lchild&&!root->rchild)
		return 1;
	else
	{
		rdepth=getDepth(root->rchild);
		ldepth=getDepth(root->lchild);
		return (rdepth>ldepth)?(rdepth):(ldepth);
	}
}



相關推薦

------平衡 搜素 完全判斷

平衡二叉樹:判斷條件1)左樹是否平衡2)右樹是否平衡 3)高度 左樹右樹相差高度不大於1               public static boolean isBalance(Node head){ if

現在有合法的的節點都是用數字表示,現在給定這樹上所有的父子關係,求這的高度

題目描述 現在有一棵合法的二叉樹,樹的節點都是用數字表示,現在給定這棵樹上所有的父子關係,求這棵樹的高度 輸入描述: 輸入的第一行表示節點的個數n(1 ≤ n ≤ 1000,節點的編號為0到n-1)組成, 下面是n-1行,每行有兩個整數,第一個數表示父節點的編號,第二個數表示子節點的編號

步寫平衡(AVL

平衡二叉樹(Balanced Binary Tree)是二叉查詢樹的一個進化體,也是第一個引入平衡概念的二叉樹。1962年,G.M. Adelson-Velsky 和 E.M. Landis發明了這棵樹,所以它又叫AVL樹。平衡二叉樹要求對於每一個節點來說,它的左右子樹

判斷個數是否在中,如果存在返回真

#include<iostream> #include<vector> using namespace std; //和連結串列的資料結構一樣 struct TreeNode{ int value; TreeNode* left;

【c++】構建簡單的

本文主要講了如何使用c++來構建一個二叉樹類,以及一些功能演算法的實現。文中大部分函式的思想都是遞迴,其中賦值運算子過載有傳統寫法和現代寫法兩個版本,層序遍歷是非遞迴,前、中、後序遍歷有遞迴和非遞迴兩

資料結構預算--二分法查詢--搜尋--平衡

資料結構預算--二叉搜尋樹與二分法查詢 二分法查詢 源於二分查詢的二叉樹搜尋 平衡二叉樹 二分法查詢 二分法:適用於從資料量較大,已經排序好的資料中定位目標資料節點的方法; 一般用於陣列中; 源於二分查詢的二叉樹搜尋 當資料量較

AVL-平衡

平衡二叉樹是高度平衡的二叉樹: 1 左右子樹的高度差最多為1. 2 主要的實現地方是插入平衡和刪除平衡。 3 為了實現平衡,每個節點儲存了一個高度h成員。 4 當插入和刪除破壞了平衡的時候需要進行旋轉; 5 根據左右子樹高度差的不同進行四中不同的旋轉:左左、右右、左右、右左

資料結構————平衡

平衡二叉搜尋樹(Self-balancing binary search tree)又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用實現方法有紅黑樹、AVL、替罪羊樹、T

[leetcode]搜尋&平衡

1.二叉搜尋樹 BST 概念: ①所有非葉子節點至多擁有兩個兒子 ②所有節點儲存一個關鍵字 ③非葉子節點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 ④二叉搜尋樹的中序遍歷是不遞減的 題目描述: Given a binary tree, dete

關於的總結從->搜尋->平衡->紅黑->B與B+

二叉樹的定義與性質,包括各種操作的原始碼在本部落格的的此處:二叉樹 二叉搜尋樹(Binary Search Tree)的定義性質以及原始碼實現在本部落格此處:二叉搜尋樹 平衡二叉樹(AVL樹),是一棵

最小堆/雜湊表//平衡/紅黑的意義

接觸堆資料結構是在排序裡面講的,空間複雜度O(1),時間複雜度O(NlogN),但是在實踐中還是不如快速排序(好像快速排序可以更好的利用硬體特性)。堆 的意義就在於:最快的找到最大/最小值,在堆結構中插入一個值重新構造堆結構,取走最大/最下值後重新構造堆結構 其時間複雜度為O(logN),而其他方法最少為O

——判斷是否是平衡

可能 dtree 左右子樹 return 返回 abs left light proc 平衡二叉樹 (空樹或者左右兩個孩子高度差不超過1) 在涉及到二叉樹的題目時,遞歸函數非常好用 列出可能性-》整理出返回值的類型-》整個遞歸過程按照同樣的結構得到子樹的信息,整合子樹的信息

判斷是不是平衡

class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) { getDepth(pRoot); return isBalanced ; } //判斷左右子樹是不是都是平衡二叉

劍指offer:輸入判斷是否是平衡

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 //後續遍歷二叉樹,遍歷過程中求子樹高度,判斷是否平衡 class Solution { public: bool IsBalanced(TreeNode *root, int & dep){

劍指Offer系列-面試題39-2:判斷是否為平衡

題目:判斷一棵樹是否為平衡二叉樹 思路:根據上一題的二叉樹的深度,在遞迴過程中加上識別符號,遞迴到當前節點,判斷當前子樹是不是一個平衡二叉樹,如果不是,就把識別符號置為false,返回識別符號即可。

如何判斷平衡

首先,想一下平衡二叉樹的概念。 平衡二叉樹(AVL樹)是滿足下面條件的二叉樹:要麼是一棵空樹,要麼左右子樹都是AVL樹,並且左右子樹的深度之差的絕對值不大於1。由此可知,要判斷一棵樹是不是AVL樹,只要判斷它的左右子樹的深度之差。問題落到了如何求一棵樹的深度上去了。下面使用

leetcode 110-判斷是否為平衡

平衡二叉樹的定義: 空樹或者左右子樹的高度差不超過1且左右子樹也是平衡二叉樹。 需要用到計算深度的方法: public int depth(TreeNode root) { if (r

【leetcode】110 判斷是否平衡

在不熟悉遞迴的情況下,用了兩次遞迴來完成該題,做一紀念{{//解決過程兩次用到遞迴,完美、快速地解決了這道題;首先一個求高度的函式這個函式要用到遞迴;之後在主函式裡面,比較兩個子樹的高度差,如果二者平衡,也要繼續分別遞迴二者;public: bool isBalance

判斷是否是平衡及其時間複雜度的優化

平衡二叉樹:它是一棵空樹或者左右子樹的高度差絕對值不超過1,並且左右兩棵子樹都是平衡二叉樹。 要判斷一棵樹是否是平衡二叉樹,由其定義我們很容易想到通過計算出左右兩棵子樹的高度及其高度差來進行判斷。 首先,判斷當前節點是否是平衡二叉樹,則需要開始遍歷整棵樹,求

面試題——判斷是否是平衡

<strong><span style="font-size:18px;"> bool IsBlance() { return _IsBlance(_root); } protected: bool _IsBlance(Node* root