面试题39—相关题目(判断平衡二叉树)
来源:互联网 发布:淘宝网男装鞋 编辑:程序博客网 时间:2024/05/21 14:50
**题目:输入一颗二叉树的根节点,判断该树是不是平衡二叉树。
代码示例:**
#include "BinaryTree.h"#include<iostream>using namespace std;// ====================方法1====================int TreeDepth(BinaryTreeNode* pRoot){ if (pRoot == NULL) return 0; int nLeft = TreeDepth(pRoot->m_pLeft); int nRight = TreeDepth(pRoot->m_pRight); return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);}bool IsBalanced_Solution1(BinaryTreeNode* pRoot){ if (pRoot == NULL) return true; int left = TreeDepth(pRoot->m_pLeft); int right = TreeDepth(pRoot->m_pRight); int diff = left - right; if (diff > 1 || diff < -1) return false; return IsBalanced_Solution1(pRoot->m_pLeft) && IsBalanced_Solution1(pRoot->m_pRight);}// ====================方法2====================bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth);bool IsBalanced_Solution2(BinaryTreeNode* pRoot){ int depth = 0; return IsBalanced(pRoot, &depth);}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;}// ====================测试代码====================void Test(char* testName, BinaryTreeNode* pRoot, bool expected){ if (testName != NULL) printf("%s begins:\n", testName); printf("Solution1 begins: "); if (IsBalanced_Solution1(pRoot) == expected) printf("Passed.\n"); else printf("Failed.\n"); printf("Solution2 begins: "); if (IsBalanced_Solution2(pRoot) == expected) printf("Passed.\n"); else printf("Failed.\n");}// 完全二叉树// 1// / \// 2 3// /\ / \// 4 5 6 7void Test1(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6); BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7); ConnectTreeNodes(pNode1, pNode2, pNode3); ConnectTreeNodes(pNode2, pNode4, pNode5); ConnectTreeNodes(pNode3, pNode6, pNode7); Test("Test1", pNode1, true); DestroyTree(pNode1);}// 不是完全二叉树,但是平衡二叉树// 1// / \// 2 3// /\ \// 4 5 6// /// 7void Test2(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6); BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7); ConnectTreeNodes(pNode1, pNode2, pNode3); ConnectTreeNodes(pNode2, pNode4, pNode5); ConnectTreeNodes(pNode3, NULL, pNode6); ConnectTreeNodes(pNode5, pNode7, NULL); Test("Test2", pNode1, true); DestroyTree(pNode1);}// 不是平衡二叉树// 1// / \// 2 3// /\ // 4 5 // /// 6void Test3(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6); ConnectTreeNodes(pNode1, pNode2, pNode3); ConnectTreeNodes(pNode2, pNode4, pNode5); ConnectTreeNodes(pNode5, pNode6, NULL); Test("Test3", pNode1, false); DestroyTree(pNode1);}// 1// /// 2// /// 3// /// 4// /// 5void Test4(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNode1, pNode2, NULL); ConnectTreeNodes(pNode2, pNode3, NULL); ConnectTreeNodes(pNode3, pNode4, NULL); ConnectTreeNodes(pNode4, pNode5, NULL); Test("Test4", pNode1, false); DestroyTree(pNode1);}// 1// \// 2// \// 3// \// 4// \// 5void Test5(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNode1, NULL, pNode2); ConnectTreeNodes(pNode2, NULL, pNode3); ConnectTreeNodes(pNode3, NULL, pNode4); ConnectTreeNodes(pNode4, NULL, pNode5); Test("Test5", pNode1, false); DestroyTree(pNode1);}// 树中只有1个结点void Test6(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); Test("Test6", pNode1, true); DestroyTree(pNode1);}// 树中没有结点void Test7(){ Test("Test7", NULL, true);}int main(){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); return 0;}
阅读全文
0 0
- 面试题39—相关题目(判断平衡二叉树)
- 面试题39:平衡二叉树判断
- 面试题39-题目2:平衡二叉树
- 面试题39_2 判断一棵树是不是平衡二叉树
- 面试题39(2). 判断是否为平衡二叉树
- 剑指offer 面试题39—二叉树的深度vs平衡二叉树判断
- 剑指 offer代码解析——面试题39判断平衡二叉树
- 剑指 offer代码解析——面试题39判断平衡二叉树(高效方法)
- 面试题39_2:平衡二叉树
- 剑指offer 面试题39 求二叉树深度|判断是否为平衡二叉树
- 剑指offer面试题39:二叉树深度以及判断平衡二叉树
- 面试题39:获得二叉树深度和判断是否是平衡二叉树
- 剑指Offer_面试题39_二叉树的深度 & 判断平衡二叉树
- 程序员面试题精选-- 判断二叉树是不是平衡的
- [各种面试题] 判断是否平衡二叉树
- 剑指offer面试题 39 二叉树的深度和判断是不是平衡树
- 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
- 剑指Offer----面试题39(2):判断是否为平衡二叉树
- 面试题39—二叉树的深度
- faster-rcnn安装配置,训练自己的数据,MATLAB,Ubuntu14
- 排序之快速排序
- matplotlib 动态图 之 散点图(一)
- 关于Activity生命周期的那些事
- 面试题39—相关题目(判断平衡二叉树)
- 贝叶斯深度学习——基于PyMC3的变分推理
- SpringBoot入门(一)
- 0024_Swap Nodes in Pairs
- 32,64位编译环境下的sizeof问题经常出现。
- eval解析及反引号与$()区别
- 机器学习--神经网络算法系列--梯度下降与随机梯度下降算法
- 【Android】第4章 数据存储(上)
- POJ 2421 Constructing Roads 笔记