剑指offer 39 - 二叉树的深度
来源:互联网 发布:迈克尔比斯利体测数据 编辑:程序博客网 时间:2024/05/23 12:29
1.先遍历二叉树的左子树的深度,然后再遍历二叉树右子树的深度。最后判断左子树和右子树的深度,如果左子树比右子树深则返回左子树深度+1,否则返回右子树深度+1。
2.判断该树是不是平衡树,我们用后序遍历的方式遍历整棵二叉树。在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度。当最后遍历到树的根结点的时候,也就判断了整棵二叉树是不是平衡二叉树了。
#include <iostream>#include<vector>using namespace std;structBinaryTreeNode{intm_nValue;BinaryTreeNode*m_pLeft;BinaryTreeNode*m_pRight;};BinaryTreeNode* CreateBinaryTreeNode(intvalue){ BinaryTreeNode*head = new BinaryTreeNode[sizeof(BinaryTreeNode )]; head->m_nValue = value; head->m_pLeft = head->m_pRight=NULL; return head;}void ConnectTreeNodes(BinaryTreeNode* root ,BinaryTreeNode* left, BinaryTreeNode* right) { if(root != NULL) { root->m_pLeft = left; root->m_pRight = right; }} void DestroyTree(BinaryTreeNode* root){if(root !=NULL){ BinaryTreeNode* left = root->m_pLeft; BinaryTreeNode* right= root->m_pRight; delete root; root=NULL; DestroyTree(left); DestroyTree( right);}}bool isBalanced(BinaryTreeNode* pRoot,int *depth) //节点深度作为参数,一边遍历一边判断是否平衡{if(pRoot==NULL){*depth=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) //此处不能写(-1<=diff<=1),错误{*depth = left>right ? (left+1) :(right+1); return true;}}return false;} 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(BinaryTreeNode* pRoot) //方法2. 需要重复遍历节点多次{ if(pRoot== NULL) return true; int nLeftDepth = TreeDepth(pRoot->m_pLeft); int nRightDepth = TreeDepth(pRoot->m_pRight); int diff = nRightDepth-nLeftDepth; if (diff>1 || diff<-1) return false; return IsBalanced(pRoot->m_pLeft)&&IsBalanced(pRoot->m_pRight); } // ====================测试代码====================void Test(char* testName, BinaryTreeNode* pRoot,bool result){ if(testName != NULL) printf("%s begins:", testName);int depth = 0; if(result == isBalanced(pRoot,&depth))printf("%s\n","passed");elseprintf("%s\n","failed"); printf("\n");}// 1// / \// 2 3// / \ \ // 4 5 6 // \ //7 void 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, NULL, pNode6); ConnectTreeNodes(pNode5, NULL, pNode7); Test("Test1", pNode1,true); DestroyTree(pNode1);}// 1// /// 2// /// 3// /// 4// /// 5void Test2(){ 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("Test2",pNode1, false); DestroyTree(pNode1);}// 1// \// 2// \// 3// \// 4// \// 5void Test3(){ 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("Test3",pNode1, false); DestroyTree(pNode1);}// 树中只有1个结点void Test4(){ BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); Test("test4",pNode1, true); DestroyTree(pNode1);}// 树中没有结点void Test5(){Test("Test5",NULL,true);}int main(int argc, char* argv[]){ Test1();Test2(); Test3(); Test4(); Test5(); return 0;}
0 0
- 剑指offer-39 二叉树的深度
- 剑指offer 39 - 二叉树的深度
- 剑指Offer 39 二叉树的深度+平衡二叉树
- 剑指offer: 二叉树的深度(树)
- 剑指Offer之二叉树的深度
- 剑指offer--二叉树的深度
- 剑指offer之二叉树的深度
- 剑指Offer之 - 二叉树的深度
- 《剑指offer》二叉树的深度
- 剑指 offer:二叉树的深度
- 剑指offer—二叉树的深度
- 剑指Offer--二叉树的深度
- 剑指offer-二叉树的深度
- 剑指offer:求二叉树的深度
- 剑指offer 38 二叉树的深度
- 剑指offer 二叉树的深度
- 剑指Offer--039-二叉树的深度
- [剑指offer]二叉树的深度
- 自然语言处理课程作业 中文文本情感分类
- 文件管理软件的优势
- C# 无客户端连接oracle 11g 乱码问题解决
- Teardrop 全屏展示 wordpress主题[更新至1.8.1]
- 集合框架_泛型
- 剑指offer 39 - 二叉树的深度
- 手机验证码
- leetcode-20 Valid Parentheses
- SqlServer 函数 大全
- 数据挖掘教材
- 第十三周 项目一 动物这样叫(3)
- Call to undefined function Think\mb_strlen()
- nginx基本配置与参数说明
- 态度