我们之前学习了二叉树相关的概念,那么我们今天来分析下二叉树中的一些经典面试题。
<强>——编写一个函数用于删除二叉树中的所有单度结点;强>
<强>——要求:结点删除后,其唯一的子结点替代它的位置。强>
示例如下
<强> a>那么在我们的结点中包含指向父结点的指针>强。定义功能:delOld1(节点),删除节点为根结点的二叉树中的单度结点;
实现思路如下
我们来看看具体代码怎么写
# include & lt; iostream> # include“BTree.h” 使用名称空间性病; 使用名称空间DTLib; 模板& lt;typename T比; BTreeNode* createTree () { 静态BTreeNode ns [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(节点)//节点为结点指针的引用;删除节点为根结点的二叉树中的单度结点;