zoukankan      html  css  js  c++  java
  • 剑指offer——面试题8:二叉树的下一个节点

      1 // 面试题8:二叉树的下一个结点
      2 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?
      3 // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
      4 
      5 #include <stdio.h>
      6 
      7 struct BinaryTreeNode
      8 {
      9     int                    m_nValue;
     10     BinaryTreeNode*        m_pLeft;
     11     BinaryTreeNode*        m_pRight;
     12     BinaryTreeNode*        m_pParent;
     13 };
     14 
     15 BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
     16 {
     17     if(pNode == nullptr)
     18         return nullptr;
     19 
     20     BinaryTreeNode* pNext = nullptr;
     21     if(pNode->m_pRight != nullptr)
     22     {
     23         BinaryTreeNode* pRight = pNode->m_pRight;
     24         while(pRight->m_pLeft != nullptr)
     25             pRight = pRight->m_pLeft;
     26 
     27         pNext = pRight;
     28     }
     29     else if(pNode->m_pParent != nullptr)
     30     {
     31         BinaryTreeNode* pCurrent = pNode;
     32         BinaryTreeNode* pParent = pNode->m_pParent;
     33         while(pParent != nullptr && pCurrent == pParent->m_pRight)
     34         {
     35             pCurrent = pParent;
     36             pParent = pParent->m_pParent;
     37         }
     38 
     39         pNext = pParent;
     40     }
     41 
     42     return pNext;
     43 }
     44 
     45 // ==================== 辅助代码用来构建二叉树 ====================
     46 BinaryTreeNode* CreateBinaryTreeNode(int value)
     47 {
     48     BinaryTreeNode* pNode = new BinaryTreeNode();
     49     pNode->m_nValue = value;
     50     pNode->m_pLeft = nullptr;
     51     pNode->m_pRight = nullptr;
     52     pNode->m_pParent = nullptr;
     53 
     54     return pNode;
     55 }
     56 
     57 void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
     58 {
     59     if(pParent != nullptr)
     60     {
     61         pParent->m_pLeft = pLeft;
     62         pParent->m_pRight = pRight;
     63 
     64         if(pLeft != nullptr)
     65             pLeft->m_pParent = pParent;
     66         if(pRight != nullptr)
     67             pRight->m_pParent = pParent;
     68     }
     69 }
     70 
     71 void PrintTreeNode(BinaryTreeNode* pNode)
     72 {
     73     if(pNode != nullptr)
     74     {
     75         printf("value of this node is: %d
    ", pNode->m_nValue);
     76 
     77         if(pNode->m_pLeft != nullptr)
     78             printf("value of its left child is: %d.
    ", pNode->m_pLeft->m_nValue);
     79         else
     80             printf("left child is null.
    ");
     81 
     82         if(pNode->m_pRight != nullptr)
     83             printf("value of its right child is: %d.
    ", pNode->m_pRight->m_nValue);
     84         else
     85             printf("right child is null.
    ");
     86     }
     87     else
     88     {
     89         printf("this node is null.
    ");
     90     }
     91 
     92     printf("
    ");
     93 }
     94 
     95 void PrintTree(BinaryTreeNode* pRoot)
     96 {
     97     PrintTreeNode(pRoot);
     98 
     99     if(pRoot != nullptr)
    100     {
    101         if(pRoot->m_pLeft != nullptr)
    102             PrintTree(pRoot->m_pLeft);
    103 
    104         if(pRoot->m_pRight != nullptr)
    105             PrintTree(pRoot->m_pRight);
    106     }
    107 }
    108 
    109 void DestroyTree(BinaryTreeNode* pRoot)
    110 {
    111     if(pRoot != nullptr)
    112     {
    113         BinaryTreeNode* pLeft = pRoot->m_pLeft;
    114         BinaryTreeNode* pRight = pRoot->m_pRight;
    115 
    116         delete pRoot;
    117         pRoot = nullptr;
    118 
    119         DestroyTree(pLeft);
    120         DestroyTree(pRight);
    121     }
    122 }
    123 
    124 // ====================测试代码====================
    125 void Test(char* testName, BinaryTreeNode* pNode, BinaryTreeNode* expected)
    126 {
    127     if(testName != nullptr)
    128         printf("%s begins: ", testName);
    129 
    130     BinaryTreeNode* pNext = GetNext(pNode);
    131     if(pNext == expected)
    132         printf("Passed.
    ");
    133     else
    134         printf("FAILED.
    ");
    135 }
    136 
    137 //            8
    138 //        6      10
    139 //       5 7    9  11
    140 void Test1_7()
    141 {
    142     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
    143     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
    144     BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
    145     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    146     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    147     BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
    148     BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
    149 
    150     ConnectTreeNodes(pNode8, pNode6, pNode10);
    151     ConnectTreeNodes(pNode6, pNode5, pNode7);
    152     ConnectTreeNodes(pNode10, pNode9, pNode11);
    153 
    154     Test("Test1", pNode8, pNode9);
    155     Test("Test2", pNode6, pNode7);
    156     Test("Test3", pNode10, pNode11);
    157     Test("Test4", pNode5, pNode6);
    158     Test("Test5", pNode7, pNode8);
    159     Test("Test6", pNode9, pNode10);
    160     Test("Test7", pNode11, nullptr);
    161 
    162     DestroyTree(pNode8);
    163 }
    164 
    165 //            5
    166 //          4
    167 //        3
    168 //      2
    169 void Test8_11()
    170 {
    171     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    172     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
    173     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
    174     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
    175 
    176     ConnectTreeNodes(pNode5, pNode4, nullptr);
    177     ConnectTreeNodes(pNode4, pNode3, nullptr);
    178     ConnectTreeNodes(pNode3, pNode2, nullptr);
    179 
    180     Test("Test8", pNode5, nullptr);
    181     Test("Test9", pNode4, pNode5);
    182     Test("Test10", pNode3, pNode4);
    183     Test("Test11", pNode2, pNode3);
    184 
    185     DestroyTree(pNode5);
    186 }
    187 
    188 //        2
    189 //         3
    190 //          4
    191 //           5
    192 void Test12_15()
    193 {
    194     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
    195     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
    196     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
    197     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    198 
    199     ConnectTreeNodes(pNode2, nullptr, pNode3);
    200     ConnectTreeNodes(pNode3, nullptr, pNode4);
    201     ConnectTreeNodes(pNode4, nullptr, pNode5);
    202 
    203     Test("Test12", pNode5, nullptr);
    204     Test("Test13", pNode4, pNode5);
    205     Test("Test14", pNode3, pNode4);
    206     Test("Test15", pNode2, pNode3);
    207 
    208     DestroyTree(pNode2);
    209 }
    210 
    211 void Test16()
    212 {
    213     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    214 
    215     Test("Test16", pNode5, nullptr);
    216 
    217     DestroyTree(pNode5);
    218 }
    219 
    220 int main(int argc, char* argv[])
    221 {
    222     Test1_7();
    223     Test8_11();
    224     Test12_15();
    225     Test16();
    226 }
    View Code
  • 相关阅读:
    数字图像处理领域算法之高斯平滑
    字符串数组元素反转
    安装visual studio 2008 team 失败
    .NET中的正则表达式 (二)RegexOptions 枚举
    手动备份、还原windows7、office2010激活信息
    [转]蓝牙基带数据传输机理分析
    .NET中的正则表达式 (三)RegexCompilationInfo 类
    Android AVD语言设置
    蓝牙协议栈
    Bluetooth StructureBlueZ
  • 原文地址:https://www.cnblogs.com/acm-jing/p/10388484.html
Copyright © 2011-2022 走看看