首页 > 其他分享 >以二叉链表为存储结构,在二叉树中删除以值x为根结点的子树

以二叉链表为存储结构,在二叉树中删除以值x为根结点的子树

时间:2024-03-28 20:29:22浏览次数:23  
标签:lchild bt 删除 BiNode void 链表 二叉树 rchild 为根

【问题描述】

首先输入扩展二叉树的前序序列,构建二叉树,然后输入希望删除的节点,输出删除后二叉树的前序和中序遍历序列。

【输入形式】 输入扩展二叉树的前序序列。

【输出形式】 分两行分别输出删除后二叉树的前序和中序遍历序列。

【样例输入】

ab##cd##e## c

【样例输出】

删除后.........

前序遍历:ab

中序遍历:ba

【样例说明】 上述输入对应以下结构的二叉树:

 a

/
b c

  /
 d e

删除以c为节点的子树后,得到下图的子树:

 a

/
b

【思路】

先判断根节点是否需要删除,需要的话就用release删除,不需要的话就检查其左右子树是否需要删除,左右子树调用delSubTree函数删除。

【题解代码】

#include<iostream>
using namespace std;

struct BiNode {
	char data;
	BiNode* lchild, * rchild;
};
class BiTree
{
private:
	BiNode* root;
	char x;
public:
	
	BiTree(){ root = creat(root); }
	~BiTree() {
	}
	BiNode* getRoot() { return root; }
	void searchDel(BiNode *bt, char x);//检查根结点
	void delSubTree(BiNode* bt, char x);//查找并删除结点
	void release(BiNode* bt);//释放树结点
	BiNode* creat(BiNode* bt);
	void preOrder(BiNode* bt);
	void inOrder(BiNode* bt);
	char getX() {  //输入要删除的结点
		cin >> x;
		return x;
	}
};
//创建二叉树
BiNode* BiTree::creat(BiNode* bt)
{
	char ch;
	cin >> ch;
	if (ch == '#')
	{
		bt = NULL;
	}
	else
	{
		bt = new BiNode;
		bt->data = ch;
		bt->lchild = creat(bt->lchild);
		bt->rchild = creat(bt->rchild);
	}
	return bt;
}

//检查根节点
void BiTree::searchDel(BiNode *bt, char x)
{
	if (bt == NULL)
		return;
	if (bt->data == x)//如果根节点就是要找的结点,直接release根节点,再将根节点赋为空
	{
		release(bt);
		root = NULL;
	}
	else//其他情况再调用delSubTree函数进行查找和删除
	{
		delSubTree(bt, x);
	}
}
//查找并删除结点
void BiTree::delSubTree(BiNode* bt, char x)
{
	if (bt == NULL)
		return;
	else
	{
		//左子树不为空,并且左子树就是要找的结点,删除左子树,再将左子树赋为空
		if (bt->lchild && bt->lchild->data == x)
		{
			release(bt->lchild);
			bt->lchild = NULL;
		}
		//右子树不为空,并且右子树就是要找的结点,删除右子树,再将右子树赋为空
		if (bt->rchild && bt->rchild->data == x)
		{
			release(bt->rchild);
			bt->rchild = NULL;
		}
		//继续递归查找
		delSubTree(bt->lchild, x);
		delSubTree(bt->rchild, x);

	}
}

void BiTree::release(BiNode* bt)
{
	if (bt != NULL)
	{
		release(bt->lchild);
		release(bt->rchild);
		delete bt;
	}
}
//前序遍历
void BiTree::preOrder(BiNode* bt)
{
	if (bt == NULL)
	{
		return;
	}
	cout << bt->data;
	preOrder(bt->lchild);
	preOrder(bt->rchild);
}
//中序遍历
void BiTree::inOrder(BiNode* bt) {
	if (bt == NULL) {
		return;
	}
	else {
		inOrder(bt->lchild);
		cout << bt->data;
		inOrder(bt->rchild);
	}
}
int main()
{
	BiTree tree;
	tree.searchDel(tree.getRoot(), tree.getX());
	cout << "删除后……" << endl;
	cout << "前序遍历:";
	tree.preOrder(tree.getRoot());
	cout << "\n中序遍历:";
	tree.inOrder(tree.getRoot());
	return 0;

}

【运行结果】

标签:lchild,bt,删除,BiNode,void,链表,二叉树,rchild,为根
From: https://blog.csdn.net/2301_79790771/article/details/137123192

相关文章

  • 设计算法判断一棵树是否为完全二叉树--c++
    【题目要求】设计算法判断一棵树是否为完全二叉树。【提示】根据完全二叉树的定义可知:1)如果一个结点有右孩子而没有左孩子,那么这棵树一定不是完全二叉树。2)如果一个结点有左孩子,而没有右孩子,那么按照层序遍历的结果,这个结点之后的所有结点都是叶子结点,这棵树才是完全二叉......
  • Python数据结构实验 树和二叉树实验(二)
    一、实验目的1.掌握二叉树的概念和二叉树的性质;2.掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构;3.掌握二叉树的基本运算算法和二叉树的先序、中序和后序遍历的递归算法的实现。二、实验环境1.Windows操作系统的计算机2.Python3.7环境平台和PyCharm编辑器三、......
  • 代码随想录Day17 ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
     110.平衡二叉树 classSolution{public://返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1intgetHeight(TreeNode*node){if(node==NULL){return0;}intleftHeight=getHeight(node->left......
  • 数据结构与算法题目集(中文)6-1 单链表逆转 C语言
    6-1单链表逆转本题要求实现一个函数,将给定的单链表逆转。函数接口定义:ListReverse(ListL);其中List结构定义如下:typedefstructNode*PtrToNode;structNode{ElementTypeData;/*存储结点数据*/PtrToNodeNext;/*指向下一个结点的指针*/};t......
  • 《leetcode hot100》142. 环形链表 II
    Accode:publicclassSolution{publicListNodedetectCycle(ListNodehead){ListNodeslow=head,fast=head;while(true){if(fast==null||fast.next==null)returnnull;slow=slow.next;......
  • LC 101.对称二叉树
    101.对称二叉树给你一个二叉树的根节点root,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false提示:树中节点数目在范围[1,1000]内−......
  • 二叉树理论基础
    结点的度:树中每个结点具有的子树数或者后继结点数称为该结点的度分支结点:度大于0的结点称为分支结点或非终端结点。度为1的结点称为单分支结点,度为2的结点称为双分支结点...树的度:树中所有结点的度的最大值称之为树的度。叶子结点(叶节点):度为0的结点称为叶子结点或终端结点孩子......
  • 二叉树的算法实现
       实例:     ......
  • Leetcode 回文链表
    Day12第一题用数组存储链表的数值,在检测是否是回文数组,数组长度不可变,所以用listclassSolution{publicbooleanisPalindrome(ListNodehead){List<Integer>list=newArrayList<>();while(head!=null){list.add(head.val);......
  • 【华为OD机试真题】C卷-二叉树的广度优先遍历(JAVA)
    一、题目描述【华为OD机试真题】C卷-二叉树的广度优先遍历(JAVA)题目描述:有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出层序遍历的结果。二、输入输出输入......