/*************************************************************** 题目一:输入一颗二叉树的根节点,求该数的深度。从根节点到叶节点依次 经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 ***************************************************************/ /* 解题思路: 树的深度等于(左右子树深度较大值+1),如果没有左右子树,则左右子树 深度设置为0; */ #include<stdio.h> struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; int treeDepath(BinaryTreeNode* pRoot) { if(pRoot == NULL) return 0; int nLeft = treeDepath(pRoot->m_pLeft); int nRight = treeDepath(pRoot->m_pRight); return(nLeft>nRight ? nLeft+1 : nRight+1); } BinaryTreeNode* createTreeNode(int value) { BinaryTreeNode* pNode = new BinaryTreeNode(); pNode->m_nValue = value; pNode->m_pLeft = NULL; pNode->m_pRight = NULL; return pNode; } void connect(BinaryTreeNode* pParent, BinaryTreeNode* pLeftChild, BinaryTreeNode* pRightChild) { if(pParent == NULL) return; pParent->m_pLeft = pLeftChild; pParent->m_pRight = pRightChild; } void test() { BinaryTreeNode* pNode1 = createTreeNode(1); BinaryTreeNode* pNode2 = createTreeNode(2); BinaryTreeNode* pNode3 = createTreeNode(3); BinaryTreeNode* pNode4 = createTreeNode(4); BinaryTreeNode* pNode5 = createTreeNode(5); BinaryTreeNode* pNode6 = createTreeNode(6); BinaryTreeNode* pNode7 = createTreeNode(7); connect(pNode1,pNode2,pNode3); connect(pNode2,pNode4,pNode5); connect(pNode5,pNode7,NULL); connect(pNode3,NULL,pNode6); int depath = treeDepath(pNode1); printf("%d\t",depath); } int main() { test(); return 0; }
/*************************************************************** 题目二:输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果 某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡 二叉树。 ***************************************************************/ /* 解题思路: 如果用前面提到的获取二叉树深度方法来遍历二叉树左右节点,以确定该二叉树 是否为平衡二叉树,这样会重复遍历一个节点多次。效率不高。 但如果我们用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前 我们已经遍历了它的左右子树。只要在遍历每个节点的时候记录它的深度,我们 就可以一边遍历一边判断每个节点是不是平衡的。 */ #include<stdio.h> struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; 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 = (left > right ? left : right) + 1; return true; } } return false; } BinaryTreeNode* createTreeNode(int value) { BinaryTreeNode* pNode = new BinaryTreeNode(); pNode->m_nValue = value; pNode->m_pLeft = NULL; pNode->m_pRight = NULL; return pNode; } void connect(BinaryTreeNode* pParent, BinaryTreeNode* pLeftChild, BinaryTreeNode* pRightChild) { if(pParent == NULL) return; pParent->m_pLeft = pLeftChild; pParent->m_pRight = pRightChild; } void test() { BinaryTreeNode* pNode1 = createTreeNode(1); BinaryTreeNode* pNode2 = createTreeNode(2); BinaryTreeNode* pNode3 = createTreeNode(3); BinaryTreeNode* pNode4 = createTreeNode(4); BinaryTreeNode* pNode5 = createTreeNode(5); BinaryTreeNode* pNode6 = createTreeNode(6); BinaryTreeNode* pNode7 = createTreeNode(7); connect(pNode1,pNode2,pNode3); connect(pNode2,pNode4,pNode5); connect(pNode5,pNode7,NULL); connect(pNode3,NULL,pNode6); int depath; if(isBalanced(pNode1,&depath)){ printf("Yes"); } } int main() { test(); return 0; }
==参考剑指offer
原文:http://blog.csdn.net/walkerkalr/article/details/21445409