判断一个二叉树是否是平衡二叉树

判断一个二叉树是否是平衡二叉树

题目:判断一个二叉排序树是否是平衡二叉树

思路:利用递归判断左右子树的深度是否相差1来判断是否是平衡二叉树。

复制代码
  1 #include<stdio.h>
  2 #include "stdafx.h"
  3 
  4 struct BinaryTreeNode
  5 {
  6     int              m_nValue;
  7     BinaryTreeNode*  m_pLeft;
  8     BinaryTreeNode*  m_pRight;
  9 };
 10 
 11 BinaryTreeNode* CreateBinaryTreeNode(int value)
 12 {
 13     BinaryTreeNode* pNode = new BinaryTreeNode();
 14     pNode->m_nValue = value;
 15     pNode->m_pLeft = NULL;
 16     pNode->m_pRight = NULL;
 17 }
 18 
 19 void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
 20 {
 21     if(pParent != NULL)
 22     {
 23         pParent->m_pLeft = pLeft;
 24         pParent->m_pRight = pRight;
 25     }
 26 }
 27 
 28 void PrintTreeNode(BinaryTreeNode* pNode)
 29 {
 30     if(pNode != NULL)
 31     {
 32         printf("value of this node is: %d\n", pNode->m_nValue);
 33         
 34         if(pNode->m_pLeft != NULL)
 35             printf("value of its left child is: %d.\n", pNode->m_pLeft->m_nValue);
 36         else
 37             printf("left child is null.\n");
 38         
 39         if(pNode->m_pRight != NULL)
 40             printf("value of its right child is: %d.\n",pNode->m_pRight->m_nValue);
 41         else
 42             printf("right child is null.\n");
 43     }
 44     else
 45     {
 46         printf("this node is null.\n");
 47     }
 48     printf("\n");
 49 }
 50 
 51 void PrintTree(BinaryTreeNode* pRoot)
 52 {
 53     PrintTreeNode(pRoot);
 54     
 55     if(pRoot != NULL)
 56     {
 57         if(pRoot->m_pLeft != NULL)
 58             PrintTree(pRoot->m_pLeft);
 59         
 60         if(pRoot->m_pRight != NULL) 
 61             PrintTree(pRoot->m_pRight);
 62     }
 63 }
 64 
 65 void DestroyTree(BinaryTreeNode* pRoot)
 66 {
 67     if(pRoot != NULL)
 68     {
 69         BinaryTreeNode* pLeft = pRoot->m_pLeft;
 70         BinaryTreeNode* pRight = pRoot->m_pRight;
 71         
 72         delete pRoot;
 73         pRoot = NULL;
 74         
 75         DestroyTree(pLeft);
 76         DestroyTree(pRight);
 77     }
 78 }
 79 
 80 
 81 //========================方法1==============================
 82 int TreeDepth(BinaryTreeNode* pRoot)
 83 {
 84     if(pRoot == NULL)
 85         return 0;
 86     
 87     int nLeft = TreeDepth(pRoot->m_pLeft);
 88     int nRight = TreeDepth(pRoot->m_pRight);
 89     
 90     return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
 91 }
 92 
 93 bool IsBalanced_Solution1(BinaryTreeNode* pRoot)
 94 {
 95     if(pRoot == NULL)
 96         return true;
 97     
 98     int left = TreeDepth(pRoot->m_pLeft);
 99     int right = TreeDepth(pRoot->m_pRight);
100     int diff = left - right;
101     if(diff > 1 || diff < -1)
102         return false;
103     
104     return IsBalanced_Solution1(pRoot->m_pLeft)
105         && IsBalanced_Solution1(pRoot->m_pRight);
106 }
107 
108 //=====================方法2===========================
109 bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth);
110 
111 bool IsBalanced_Solution2(BinaryTreeNode* pRoot)
112 {
113     int depth = 0;
114     return IsBalanced(pRoot, &depth);
115 }
116 
117 bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth)
118 {
119     if(pRoot == NULL)
120     {
121         *pDepth = 0;
122         return true;
123     }
124     
125     int left, right;
126     if(IsBalanced(pRoot->m_pLeft, &left)
127         && IsBalanced(pRoot->m_pRight, &right))
128     {
129         int diff = left - right;
130         if(diff <= 1 && diff >= -1)
131         {
132             *pDepth = 1+ (left > right ? left : right);
133             return true;
134         }
135     }
136     
137     return false;
138 }
139 
140 // 不是完全二叉树,但是平衡二叉树
141 //             1
142 //         /      \
143 //        2        3
144 //       /\         \
145 //      4  5         6
146 //        /
147 //       7
148 
149 int main()
150 {
151     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
152     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
153     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
154     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
155     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
156     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
157     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
158 
159     ConnectTreeNodes(pNode1, pNode2, pNode3);
160     ConnectTreeNodes(pNode2, pNode4, pNode5);
161     ConnectTreeNodes(pNode3, pNode6, pNode7);
162     
163     printf("Solution1 begins: ");
164      if(IsBalanced_Solution1(pNode1))
165          printf("is balanced.\n");
166      else
167          printf("not balanced.\n");
168      
169      printf("Solution2 begins: ");
170      if(IsBalanced_Solution2(pNode1))
171          printf("is balanced.\n");
172      else
173          printf("not balanced.\n");
174      printf("\n");
175      
176      DestroyTree(pNode1);
177      
178     return 0;
179 }
180  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值