编程算法 - 判断二叉树是不是平衡树 代码(C)

判断二叉树是不平衡树 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 输入一颗二叉树的根结点, 判断该树是不是平衡二叉树.

二叉平衡树: 任意结点的左右子树的深度相差不超过1.

使用后序遍历的方式, 并且保存左右子树的深度, 进行比较.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct BinaryTreeNode {
	int m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};

bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth) {
	if (pRoot == NULL) {
		*pDepth = 0;
		return true;
	}
	int left, right;
	if (IsBalanced(pRoot->m_pLeft, &left) && IsBalanced(pRoot->m_pRight, &right)) {
		int diff = left - right;
		if (diff>=-1 && diff<=1) {
			*pDepth = 1 + (left>right?left:right);
			return true;
		}
	}
	return false;
}

bool IsBalanced(BinaryTreeNode* pRoot) {
	int depth = 0;
	return IsBalanced(pRoot, &depth);
}

BinaryTreeNode* init(void) {
	BinaryTreeNode* pRoot = new BinaryTreeNode(); pRoot->m_nValue = 1;
	BinaryTreeNode* pNode2 = new BinaryTreeNode(); pNode2->m_nValue = 2;
	BinaryTreeNode* pNode3 = new BinaryTreeNode(); pNode3->m_nValue = 3;
	BinaryTreeNode* pNode4 = new BinaryTreeNode(); pNode4->m_nValue = 4;
	BinaryTreeNode* pNode5 = new BinaryTreeNode(); pNode5->m_nValue = 5;
	BinaryTreeNode* pNode6 = new BinaryTreeNode(); pNode6->m_nValue = 6;
	BinaryTreeNode* pNode7 = new BinaryTreeNode(); pNode7->m_nValue = 7;
	pRoot->m_pLeft = pNode2; pRoot->m_pRight = pNode3;
	pNode2->m_pLeft = pNode4; pNode2->m_pRight = pNode5;
	pNode4->m_pLeft = NULL; pNode4->m_pRight = NULL;
	pNode5->m_pLeft = pNode7; pNode5->m_pRight = NULL;
	pNode7->m_pLeft = NULL; pNode7->m_pRight = NULL;
	pNode3->m_pLeft = NULL; pNode3->m_pRight = pNode6;
	pNode6->m_pLeft = NULL; pNode6->m_pRight = NULL;
	return pRoot;
}

int main(void)
{
	BinaryTreeNode* pRoot = init();
	bool result = IsBalanced(pRoot);
	printf("result = %s\n", result==false?"false":"true");
    return 0;
}

输出:

result = true

编程算法 - 判断二叉树是不是平衡树 代码(C),布布扣,bubuko.com

时间: 2024-12-27 16:09:07

编程算法 - 判断二叉树是不是平衡树 代码(C)的相关文章

编程算法 - 推断二叉树是不是平衡树 代码(C)

推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 而且保存左右子树的深度, 进行比較. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

编程算法 - 篱笆修理(Fence Repair) 代码(C)

篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 切割的开销是木板长度, 求将木板切割完的最小开销. 即霍夫曼编码(Huffman). 贪心算法, 类似二叉树型结构, 最短板和次短板是兄弟结点, 选取两个最小木板, 最后进行切割, 合并两个最小木板, 依次递推. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author:

编程算法 - 最小的k个数 代码(C)

最小的k个数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用快速排序(Quick Sort)的方法求解, 把索引值(index)指向前k个数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdl

编程算法 - 单源最短路问题 Bellman-Ford 代码(C)

单源最短路问题 Bellman-Ford 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 单源最短路: 固定一个起点, 求它到其他所有点的最短路的问题. Bellman-Ford: 设当前到顶点i的最短路长度为d[i], 并设初值d[s]=0, d[i]=INF, 再不断使用递推关系式d[e.to] = d[e.from] + e.cost更新d的值. 时间复杂度: O(V*E) 代码: /* * CppPrimer.cpp * * Created

编程算法 - 不用加减乘除做加法 代码(C)

不用加减乘除做加法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数, 求两个整数之和, 要求在函数体内不得使用+, -, *, /四则运算符号. 不能使用运算符号, 使用位运算, 第一步异或运算选位, 第二步与运算进位. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostream> #include <list>

编程算法 - 背包问题(记忆化搜索) 代码(C)

背包问题(记忆化搜索) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目参考: http://blog.csdn.net/caroline_wendy/article/details/37912949 使用记忆化搜索, 需要存储每组的值, 下次不需要进行继续迭代, 可以降低至时间复杂度O(nW). 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse c

编程算法 - 把字符串转换为整数 代码(C)

把字符串转换为整数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数StrToInt, 模拟atoi的功能, 把字符串转换为整数. 须要考虑异常处理, 正负数, 还有Int的最大值(0x7FFFFFFF)和最小值(0x80000000)等情况. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.h> #include &l

编程算法 - 背包问题(三种动态规划) 代码(C)

背包问题(三种动态规划) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目參考: http://blog.csdn.net/caroline_wendy/article/details/37912949 能够用动态规划(Dynamic Programming, DP)求解, 能够通过记忆化搜索推导出递推式, 能够使用三种不同的方向进行求解. 动态规划主要是状态转移, 须要理解清晰. 代码: /* * main.cpp * * Created o

编程算法 - 水洼的数量 代码(C)

水洼的数量 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被觉得是连接在一起的. 请求出园子里总共同拥有多少水洼. 使用深度优先搜索(DFS), 在某一处水洼, 从8个方向查找, 直到找到全部连通的积水. 再次指定下一个水洼, 直到没有水洼为止. 则全部的深度优先搜索的次数, 就是水洼数. 时间复杂度O(8*M*N)=O(M*N). 代码: /* * main.cpp * * Cre