剑指Offer-第3章 高质量代码
第3章 高质量代码
3中错误处理的方法
面试题11: 数值的整数次方
bool g_InvalidInput = false; bool equal(double num1, double num2); double PowerWithUnsignedExponent(double base, unsigned int exponent); double Power(double base, int exponent) { g_InvalidInput = false; if(equal(base, 0.0) && exponent < 0) { g_InvalidInput = true; return 0.0; } unsigned int absExponent = (unsigned int)(exponent); if(exponent < 0) absExponent = (unsigned int)(-exponent); double result = PowerWithUnsignedExponent(base, absExponent); if(exponent < 0) result = 1.0 / result; return result; } /* double PowerWithUnsignedExponent(double base, unsigned int exponent) { double result = 1.0; / for(int i = 1; i <= exponent; ++i) result *= base; return result; } */ double PowerWithUnsignedExponent(double base, unsigned int exponent) { if(exponent == 0) return 1; if(exponent == 1) return base; double result = PowerWithUnsignedExponent(base, exponent >> 1); result *= result; if((exponent & 0x1) == 1) result *= base; return result; } bool equal(double num1, double num2) { if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) return true; else return false; } // ====================测试代码==================== void Test(double base, int exponent, double expectedResult, bool expectedFlag) { double result = Power(base, exponent); if(abs(result - expectedResult) < 0.00000001 && g_InvalidInput == expectedFlag) printf("Test passed.\n"); else printf("Test failed.\n"); } int main(int argc, char* argv[]) { // 底数、指数都为正数 printf("Test1 begins.\n"); Test(2, 3, 8, false); // 底数为负数、指数为正数 printf("Test2 begins.\n"); Test(-2, 3, -8, false); // 指数为负数 printf("Test3 begins.\n"); Test(2, -3, 0.125, false); // 指数为0 printf("Test4 begins.\n"); Test(2, 0, 1, false); // 底数、指数都为0 printf("Test5 begins.\n"); Test(0, 0, 1, false); // 底数为0、指数为正数 printf("Test6 begins.\n"); Test(0, 4, 0, false); // 底数为0、指数为负数 printf("Test7 begins.\n"); Test(0, -4, 0, true); return 0; }
面试题12: 打印1到最大的n位数
void PrintNumber(char*number); bool Increment(char* number); void Print1ToMaxOfNDigits_1(int n){ if(n<=0) return ; char* number=new char[n+1]; memset(number,'0',sizeof(char)*(n+1)); number[n]='\0'; while(!Increment(number)){ PrintNumber(number); } delete[] number; } void PrintNumber(char* number){ char* p=number; while(*p=='0') p++; printf("%s\n",p); } bool Increment(char* number){ int len=strlen(number); int carry=0,r; int t; for(int i=len-1;i>=0;i--){ t=number[i]-'0'+carry; if(i==len-1) t++; if(i==0&&t>9) return true; r=t%10; carry=t/10; number[i]='0'+r; } return false; } // ====================方法二==================== void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index) { if(index==length-1){ PrintNumber(number); } else{ for(int i=0;i<10;i++){ number[index+1]=i+'0'; Print1ToMaxOfNDigitsRecursively(number,length,index+1); } } } void Print1ToMaxOfNDigits_2(int n){ if(n<=0) return ; char* number=new char[n+1]; memset(number,'0',sizeof(char)*(n+1)); number[n]='\0'; for(int i=0;i<10;i++){ number[0]=i+'0'; Print1ToMaxOfNDigitsRecursively(number,n,0); } } // ====================测试代码==================== void Test(int n) { printf("Test for %d begins:\n", n); Print1ToMaxOfNDigits_1(n); Print1ToMaxOfNDigits_2(n); printf("Test for %d ends.\n", n); } int main(int argc, char* argv[]) { Test(1); Test(2); Test(3); Test(4); Test(0); Test(-1); return 0; }
这个面试题其实很简单的,就是利用快排中交换的思想. 这儿想要说明一个函数指针的使用问题.
代码如下:
void Reorder(int *pData, unsigned int length, bool (*func)(int)); bool isEven(int n); // ====================方法一==================== void ReorderOddEven_1(int *pData, unsigned int length) { if(pData == NULL || length == 0) return; int *pBegin = pData; int *pEnd = pData + length - 1; while(pBegin < pEnd) { // 向后移动pBegin,直到它指向偶数 while(pBegin < pEnd && (*pBegin & 0x1) != 0) pBegin ++; // 向前移动pEnd,直到它指向奇数 while(pBegin < pEnd && (*pEnd & 0x1) == 0) pEnd --; if(pBegin < pEnd) { int temp = *pBegin; *pBegin = *pEnd; *pEnd = temp; } } } // ====================方法二==================== void ReorderOddEven_2(int *pData, unsigned int length) { Reorder(pData, length, isEven); } void Reorder(int *pData, unsigned int length, bool (*func)(int)) { if(pData == NULL || length == 0) return; int *pBegin = pData; int *pEnd = pData + length - 1; while(pBegin < pEnd) { // 向后移动pBegin while(pBegin < pEnd && !func(*pBegin)) pBegin ++; // 向前移动pEnd while(pBegin < pEnd && func(*pEnd)) pEnd --; if(pBegin < pEnd) { int temp = *pBegin; *pBegin = *pEnd; *pEnd = temp; } } } bool isEven(int n) { return (n & 1) == 0; } // ====================测试代码==================== void PrintArray(int numbers[], int length) { if(length < 0) return; for(int i = 0; i < length; ++i) printf("%d\t", numbers[i]); printf("\n"); } void Test(char* testName, int numbers[], int length) { if(testName != NULL) printf("%s begins:\n", testName); int* copy = new int[length]; for(int i = 0; i < length; ++i) { copy[i] = numbers[i]; } printf("Test for solution 1:\n"); PrintArray(numbers, length); ReorderOddEven_1(numbers, length); PrintArray(numbers, length); printf("Test for solution 2:\n"); PrintArray(copy, length); ReorderOddEven_2(copy, length); PrintArray(copy, length); delete[] copy; } void Test1() { int numbers[] = {1, 2, 3, 4, 5, 6, 7}; Test("Test1", numbers, sizeof(numbers)/sizeof(int)); } void Test2() { int numbers[] = {2, 4, 6, 1, 3, 5, 7}; Test("Test2", numbers, sizeof(numbers)/sizeof(int)); } void Test3() { int numbers[] = {1, 3, 5, 7, 2, 4, 6}; Test("Test3", numbers, sizeof(numbers)/sizeof(int)); } void Test4() { int numbers[] = {1}; Test("Test4", numbers, sizeof(numbers)/sizeof(int)); } void Test5() { int numbers[] = {2}; Test("Test5", numbers, sizeof(numbers)/sizeof(int)); } void Test6() { Test("Test6", NULL, 0); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0; }
代码如下:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){ if(pListHead==0||k==0) return 0; ListNode* p=pListHead; for(int i=1;i<k;i++){ p=p->m_pNext; if(p==0) return 0; } ListNode* q=pListHead; while(p->m_pNext!=0){ p=p->m_pNext; q=q->m_pNext; } return q; } // ====================测试代码==================== // 测试要找的结点在链表中间 void Test1() { printf("=====Test1 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: 4.\n"); ListNode* pNode = FindKthToTail(pNode1, 2); PrintListNode(pNode); DestroyList(pNode1); } // 测试要找的结点是链表的尾结点 void Test2() { printf("=====Test2 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: 5.\n"); ListNode* pNode = FindKthToTail(pNode1, 1); PrintListNode(pNode); DestroyList(pNode1); } // 测试要找的结点是链表的头结点 void Test3() { printf("=====Test3 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: 1.\n"); ListNode* pNode = FindKthToTail(pNode1, 5); PrintListNode(pNode); DestroyList(pNode1); } // 测试空链表 void Test4() { printf("=====Test4 starts:=====\n"); printf("expected result: NULL.\n"); ListNode* pNode = FindKthToTail(NULL, 100); PrintListNode(pNode); } // 测试输入的第二个参数大于链表的结点总数 void Test5() { printf("=====Test5 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: NULL.\n"); ListNode* pNode = FindKthToTail(pNode1, 6); PrintListNode(pNode); DestroyList(pNode1); } // 测试输入的第二个参数为0 void Test6() { printf("=====Test6 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: NULL.\n"); ListNode* pNode = FindKthToTail(pNode1, 0); PrintListNode(pNode); DestroyList(pNode1); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0; }
代码如下:
ListNode* ReverseList(ListNode* pHead){ if(pHead==0) return 0; ListNode* p=pHead,*pp=0,*q=0; while(p!=0){ q=p->m_pNext; p->m_pNext=pp; pp=p; p=q; } return pp; } // ====================测试代码==================== ListNode* Test(ListNode* pHead) { printf("The original list is: \n"); PrintList(pHead); ListNode* pReversedHead = ReverseList(pHead); printf("The reversed list is: \n"); PrintList(pReversedHead); return pReversedHead; } // 输入的链表有多个结点 void Test1() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); ListNode* pReversedHead = Test(pNode1); DestroyList(pReversedHead); } // 输入的链表只有一个结点 void Test2() { ListNode* pNode1 = CreateListNode(1); ListNode* pReversedHead = Test(pNode1); DestroyList(pReversedHead); } // 输入空链表 void Test3() { Test(NULL); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); return 0; }
代码如下:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if(pHead1==0) return pHead2; if(pHead2==0) return pHead1; ListNode* pMerge; if(pHead1->m_nValue<pHead2->m_nValue){ pMerge=pHead1; pMerge->m_pNext=Merge(pHead1->m_pNext,pHead2); } else{ pMerge=pHead2; pMerge->m_pNext=Merge(pHead1,pHead2->m_pNext); } return pMerge; } // ====================测试代码==================== ListNode* Test(char* testName, ListNode* pHead1, ListNode* pHead2) { if(testName != NULL) printf("%s begins:\n", testName); printf("The first list is:\n"); PrintList(pHead1); printf("The second list is:\n"); PrintList(pHead2); printf("The merged list is:\n"); ListNode* pMergedHead = Merge(pHead1, pHead2); PrintList(pMergedHead); printf("\n\n"); return pMergedHead; } // list1: 1->3->5 // list2: 2->4->6 void Test1() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode3 = CreateListNode(3); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode3); ConnectListNodes(pNode3, pNode5); ListNode* pNode2 = CreateListNode(2); ListNode* pNode4 = CreateListNode(4); ListNode* pNode6 = CreateListNode(6); ConnectListNodes(pNode2, pNode4); ConnectListNodes(pNode4, pNode6); ListNode* pMergedHead = Test("Test1", pNode1, pNode2); DestroyList(pMergedHead); } // 两个链表中有重复的数字 // list1: 1->3->5 // list2: 1->3->5 void Test2() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode3 = CreateListNode(3); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode3); ConnectListNodes(pNode3, pNode5); ListNode* pNode2 = CreateListNode(1); ListNode* pNode4 = CreateListNode(3); ListNode* pNode6 = CreateListNode(5); ConnectListNodes(pNode2, pNode4); ConnectListNodes(pNode4, pNode6); ListNode* pMergedHead = Test("Test2", pNode1, pNode2); DestroyList(pMergedHead); } // 两个链表都只有一个数字 // list1: 1 // list2: 2 void Test3() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pMergedHead = Test("Test3", pNode1, pNode2); DestroyList(pMergedHead); } // 一个链表为空链表 // list1: 1->3->5 // list2: 空链表 void Test4() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode3 = CreateListNode(3); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode3); ConnectListNodes(pNode3, pNode5); ListNode* pMergedHead = Test("Test4", pNode1, NULL); DestroyList(pMergedHead); } // 两个链表都为空链表 // list1: 空链表 // list2: 空链表 void Test5() { ListNode* pMergedHead = Test("Test5", NULL, NULL); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); return 0; }
代码如下:
bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2); bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){ bool flag=false; if(pRoot1!=0&&pRoot2!=0){ flag=DoesTree1HaveTree2(pRoot1,pRoot2); if(!flag) flag=HasSubtree(pRoot1->m_pLeft,pRoot2)||HasSubtree(pRoot1->m_pRight,pRoot2); } return flag; } bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){ if(pRoot2==0) return true; if(pRoot1==0) return false; if(pRoot1->m_nValue!=pRoot2->m_nValue) return false; return DoesTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft)&& DoesTree1HaveTree2(pRoot1->m_pRight,pRoot2->m_pRight); } // ====================测试代码==================== void Test(char* testName, BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2, bool expected) { if(HasSubtree(pRoot1, pRoot2) == expected) printf("%s passed.\n", testName); else printf("%s failed.\n", testName); } // 树中结点含有分叉,树B是树A的子结构 // 8 8 // / \ / \ // 8 7 9 2 // / \ // 9 2 // / \ // 4 7 void Test1() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(7); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(2); BinaryTreeNode* pNodeA6 = CreateBinaryTreeNode(4); BinaryTreeNode* pNodeA7 = CreateBinaryTreeNode(7); ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, pNodeB2, pNodeB3); Test("Test1", pNodeA1, pNodeB1, true); DestroyTree(pNodeA1); DestroyTree(pNodeB1); } // 树中结点含有分叉,树B不是树A的子结构 // 8 8 // / \ / \ // 8 7 9 2 // / \ // 9 3 // / \ // 4 7 void Test2() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(7); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(3); BinaryTreeNode* pNodeA6 = CreateBinaryTreeNode(4); BinaryTreeNode* pNodeA7 = CreateBinaryTreeNode(7); ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, pNodeB2, pNodeB3); Test("Test2", pNodeA1, pNodeB1, false); DestroyTree(pNodeA1); DestroyTree(pNodeB1); } // 树中结点只有左子结点,树B是树A的子结构 // 8 8 // / / // 8 9 // / / // 9 2 // / // 2 // / // 5 void Test3() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNodeA1, pNodeA2, NULL); ConnectTreeNodes(pNodeA2, pNodeA3, NULL); ConnectTreeNodes(pNodeA3, pNodeA4, NULL); ConnectTreeNodes(pNodeA4, pNodeA5, NULL); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, pNodeB2, NULL); ConnectTreeNodes(pNodeB2, pNodeB3, NULL); Test("Test3", pNodeA1, pNodeB1, true); DestroyTree(pNodeA1); DestroyTree(pNodeB1); } // 树中结点只有左子结点,树B不是树A的子结构 // 8 8 // / / // 8 9 // / / // 9 3 // / // 2 // / // 5 void Test4() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNodeA1, pNodeA2, NULL); ConnectTreeNodes(pNodeA2, pNodeA3, NULL); ConnectTreeNodes(pNodeA3, pNodeA4, NULL); ConnectTreeNodes(pNodeA4, pNodeA5, NULL); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(3); ConnectTreeNodes(pNodeB1, pNodeB2, NULL); ConnectTreeNodes(pNodeB2, pNodeB3, NULL); Test("Test4", pNodeA1, pNodeB1, false); DestroyTree(pNodeA1); DestroyTree(pNodeB1); } // 树中结点只有右子结点,树B是树A的子结构 // 8 8 // \ \ // 8 9 // \ \ // 9 2 // \ // 2 // \ // 5 void Test5() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNodeA1, NULL, pNodeA2); ConnectTreeNodes(pNodeA2, NULL, pNodeA3); ConnectTreeNodes(pNodeA3, NULL, pNodeA4); ConnectTreeNodes(pNodeA4, NULL, pNodeA5); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, NULL, pNodeB2); ConnectTreeNodes(pNodeB2, NULL, pNodeB3); Test("Test5", pNodeA1, pNodeB1, true); DestroyTree(pNodeA1); DestroyTree(pNodeB1); } // 树A中结点只有右子结点,树B不是树A的子结构 // 8 8 // \ \ // 8 9 // \ / \ // 9 3 2 // \ // 2 // \ // 5 void Test6() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2); BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNodeA1, NULL, pNodeA2); ConnectTreeNodes(pNodeA2, NULL, pNodeA3); ConnectTreeNodes(pNodeA3, NULL, pNodeA4); ConnectTreeNodes(pNodeA4, NULL, pNodeA5); BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNodeB4 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, NULL, pNodeB2); ConnectTreeNodes(pNodeB2, pNodeB3, pNodeB4); Test("Test6", pNodeA1, pNodeB1, false); DestroyTree(pNodeA1); DestroyTree(pNodeB1); } // 树A为空树 void Test7() { BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNodeB4 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeB1, NULL, pNodeB2); ConnectTreeNodes(pNodeB2, pNodeB3, pNodeB4); Test("Test7", NULL, pNodeB1, false); DestroyTree(pNodeB1); } // 树B为空树 void Test8() { BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8); BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(9); BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNodeA1, NULL, pNodeA2); ConnectTreeNodes(pNodeA2, pNodeA3, pNodeA4); Test("Test8", pNodeA1, NULL, false); DestroyTree(pNodeA1); } // 树A和树B都为空 void Test9() { Test("Test9", NULL, NULL, false); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); Test8(); Test9(); return 0; }