程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 判斷一個二叉樹是否是平衡二叉樹,判斷二叉樹

判斷一個二叉樹是否是平衡二叉樹,判斷二叉樹

編輯:C++入門知識

判斷一個二叉樹是否是平衡二叉樹,判斷二叉樹


題目:判斷一個二叉排序樹是否是平衡二叉樹

思路:利用遞歸判斷左右子樹的深度是否相差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  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved