/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q:
二叉树得蛇毒:
输入一颗二叉树得根节点,求该树得深度,从根节点到叶子节点依次经过得结点(包含
根节点和叶子节点)形成树得一条路径,最长路径得长度称为该树得深度。
S:
这样理解树深度:
如果一棵树只有一个结点,那么它的深度是1.如果根节点只有左子树而没有右子树,那么
树的深度应该是左子树深度加1;同样如果根节点只有右子树而没有左子树,那么树的深度
是右子树得深渡加1;如果既有左子树也有右子树,那么树的深度就是两者中最大值加1.
*/
#include "../utils/BinaryTree.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
int treeDepth(BinaryTreeNode*T)
{
if(T == nullptr)
return 0;
int left = treeDepth(T->m_pLeft);
int right = treeDepth(T->m_pRight);
return (left>right)?(left+1):(right+1);
}
bool isBalancedTree_repeatNode(BinaryTreeNode*T)
{
if(T == nullptr)
return true;
int left = treeDepth(T->m_pLeft);
int right = treeDepth(T->m_pRight);
int diff = left - right;
if(diff > 1 || diff < -1)
return false;
return isBalancedTree_repeatNode(T->m_pLeft) && isBalancedTree_repeatNode(T->m_pRight);
}
bool isBalancedTree_noRepeatNode(BinaryTreeNode*T, int*pDepth)
{
if(T == nullptr)
{
*pDepth = 0;
return true;
}
int left, right;
if(isBalancedTree_noRepeatNode(T->m_pLeft, &left) && isBalancedTree_noRepeatNode(T->m_pRight, &right))
{
int diff = left - right;
if(diff <= 1 && diff >= -1)
{
*pDepth = 1 + (left > right?left:right);
return true;
}
}
return false;
}
void test_1()
{
std::cout << "Test 1" << std::endl;
BinaryTreeNode*T1 = createBinaryTreeNode(1);
BinaryTreeNode*T2 = createBinaryTreeNode(2);
BinaryTreeNode*T3 = createBinaryTreeNode(3);
BinaryTreeNode*T4 = createBinaryTreeNode(4);
BinaryTreeNode*T5 = createBinaryTreeNode(5);
BinaryTreeNode*T6 = createBinaryTreeNode(6);
BinaryTreeNode*T7 = createBinaryTreeNode(7);
connectTreeNodes(T1, T2, T3);
connectTreeNodes(T2, T4, T5);
connectTreeNodes(T3, nullptr, T6);
connectTreeNodes(T5, T7, nullptr);
printTreePreOrder(T1);
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_repeatNode(T1) << std::endl;
int pDepth = 0;
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_noRepeatNode(T1, &pDepth) << std::endl;
destroyTree(T1);
}
void test_2()
{
std::cout << "Test 2" << std::endl;
BinaryTreeNode*T1 = createBinaryTreeNode(1);
BinaryTreeNode*T2 = createBinaryTreeNode(2);
BinaryTreeNode*T3 = createBinaryTreeNode(3);
BinaryTreeNode*T4 = createBinaryTreeNode(4);
BinaryTreeNode*T5 = createBinaryTreeNode(5);
BinaryTreeNode*T6 = createBinaryTreeNode(6);
BinaryTreeNode*T7 = createBinaryTreeNode(7);
connectTreeNodes(T1, T2, nullptr);
connectTreeNodes(T2, T3, nullptr);
connectTreeNodes(T3, T4, nullptr);
connectTreeNodes(T4, T5, nullptr);
connectTreeNodes(T5, T6, nullptr);
printTreePreOrder(T1);
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_repeatNode(T1) << std::endl;
int pDepth = 0;
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_noRepeatNode(T1, &pDepth) << std::endl;
destroyTree(T1);
}
void test_3()
{
std::cout << "Test 3" << std::endl;
BinaryTreeNode*T1 = createBinaryTreeNode(1);
BinaryTreeNode*T2 = createBinaryTreeNode(2);
BinaryTreeNode*T3 = createBinaryTreeNode(3);
BinaryTreeNode*T4 = createBinaryTreeNode(4);
BinaryTreeNode*T5 = createBinaryTreeNode(5);
BinaryTreeNode*T6 = createBinaryTreeNode(6);
BinaryTreeNode*T7 = createBinaryTreeNode(7);
connectTreeNodes(T1, nullptr, T2);
connectTreeNodes(T2, nullptr, T3);
connectTreeNodes(T3, nullptr, T4);
connectTreeNodes(T4, nullptr, T5);
connectTreeNodes(T5, nullptr, T6);
printTreePreOrder(T1);
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_repeatNode(T1) << std::endl;
int pDepth = 0;
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_noRepeatNode(T1, &pDepth) << std::endl;
destroyTree(T1);
}
void test_4()
{
std::cout << "Test 4" << std::endl;
BinaryTreeNode*T1 = createBinaryTreeNode(1);
connectTreeNodes(T1, nullptr, nullptr);
printTreePreOrder(T1);
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_repeatNode(T1) << std::endl;
int pDepth = 0;
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_noRepeatNode(T1, &pDepth) << std::endl;
destroyTree(T1);
}
void test_5()
{
std::cout << "Test 5" << std::endl;
BinaryTreeNode*T1 = nullptr;
connectTreeNodes(T1, nullptr, nullptr);
printTreePreOrder(T1);
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_repeatNode(T1) << std::endl;
int pDepth = 0;
std::cout << std::endl << "Is Balanced Tree : " << isBalancedTree_noRepeatNode(T1, &pDepth) << std::endl;
destroyTree(T1);
}
void test_treeDepth()
{
test_1();
test_2();
test_3();
test_4();
test_5();
}
int main(int argc, char**argv)
{
test_treeDepth();
return 0;
}
剑指offer-判断一二叉树是不是平衡二叉树
最新推荐文章于 2021-10-31 09:00:00 发布