二叉树的经典面试题分析(三十七)

  

我们之前学习了二叉树相关的概念,那么我们今天来分析下二叉树中的一些经典面试题。

<强>——编写一个函数用于删除二叉树中的所有单度结点;

<强>——要求:结点删除后,其唯一的子结点替代它的位置。

示例如下

二叉树的经典面试题分析(三十七)

<强> a>那么在我们的结点中包含指向父结点的指针强。定义功能:delOld1(节点),删除节点为根结点的二叉树中的单度结点;

实现思路如下

二叉树的经典面试题分析(三十七)

我们来看看具体代码怎么写

# include & lt; iostream>   # include“BTree.h”      使用名称空间性病;   使用名称空间DTLib;      模板& lt;typename T比;   BTreeNode * createTree ()   {   静态BTreeNodens [9];      for (int i=0;i<9;我+ +)   {   ns[我]。值=https://www.yisu.com/zixun/i;   ns[我]。父母=零;   ns[我]。左=零;   ns[我]。正确的=零;   }      ns [0]。左=ns [1];   ns [0]。正确的=ns [2];   ns [1]。父母=ns [0];   ns [2]。父母=ns [0];      ns [1]。左=ns [3];   ns [1]。正确的=零;   ns [3]。父母=ns [1];      ns [2]。左=ns [4];   ns [2]。正确的=ns [5];   ns [4]。父母=ns [2];   ns [5]。父母=ns [2];      ns [3]。左=零;   ns [3]。正确的=ns [6];   ns [6]。父母=ns [3];      ns [4]。左=ns [7];   ns [4]。正确的=零;   ns [7]。父母=ns [4];      ns [5]。左=ns [8];   ns [5]。正确的=零;   ns [8]。父母=ns [5];      返回ns;   }      模板   空白printInOrder (BTreeNode *节点)   {   如果(节点!=NULL)   {   printInOrder(节点->左);      cout <<节点->价值”;      printInOrder(节点→右);   }   }      模板& lt;typename T比;   空白printDualList (BTreeNode *节点)   {   BTreeNode * g=节点;      cout & lt; & lt;“头→尾巴:“& lt; & lt;endl;      而(节点!=NULL)   {   cout & lt; & lt;节点→值& lt; & lt;“”;      g=节点;      节点=节点→正确;   }      cout & lt; & lt;endl;      cout & lt; & lt;“尾部→头:“& lt; & lt;endl;      而(g !=NULL)   {   cout & lt; & lt;g→价值& lt; & lt;“”;      g=g→左;   }      cout & lt; & lt;endl;   }      template * delOld1 (BTreeNode *节点)   {   BTreeNode * ret=零;      如果(节点!=NULL)   {   如果(((节点→左!=NULL),,(节点→右==NULL) | |   ((节点→左==NULL),,(节点→右!=NULL)))   {   BTreeNode *父母=dynamic_cast *祝辞(节点→父);   BTreeNode * node_child=(节点→左!=NULL) ?节点→左:节点→正确;      如果(父!=NULL)   {   BTreeNode *,parent_child=(父→左==节点)?父母→左:父母→正确;      parent_child=node_child;   node_child→父母=父母;   }   其他的   {   node_child→父母=零;   }      如果(节点→国旗())   {   删除节点;   }      ret=delOld1 (node_child);   }   其他的   {   delOld1(节点→左);   delOld1(节点→右);      ret=节点;   }   }      返回受潮湿腐烂;   }      int main ()   {   BTreeNode * ns=createTree ();      printInOrder (ns);      cout & lt; & lt;endl;      ns=delOld1 (ns);      printInOrder (ns);      cout & lt; & lt;endl;      int []={6 7 8};      for (int i=0;i<3;我+ +)   {   TreeNode * n=ns +[我];      而(n !=NULL)   {   cout & lt; & lt;n→价值& lt; & lt;“”;      n=n→父母;   }      cout & lt; & lt;endl;   }      返回0;   }

我们在其中构建的是上图中的二叉树,来运行看看结果

二叉树的经典面试题分析(三十七)

我们看到运行的结果和我们想象的是一致的,前序遍历完后的结果为6 0 7 2 8。

<强> b>结点中只包含左右孩子指针强。定义功能:delOld2(节点)//节点为结点指针的引用;删除节点为根结点的二叉树中的单度结点;

二叉树的经典面试题分析(三十七)