首页 > 其他分享 >数据结构 ——— 链式二叉树oj题:对称二叉树

数据结构 ——— 链式二叉树oj题:对称二叉树

时间:2024-11-11 09:18:09浏览次数:3  
标签:NULL return oj BTNode right 二叉树 数据结构 left

目录

题目要求

手搓一个对称二叉树

代码实现 


题目要求

给你一个二叉树的根节点 root , 检查它是否轴对称


手搓一个对称二叉树

代码演示:

// 数据类型
typedef int BTDataType;
 
// 二叉树节点的结构
typedef struct BinaryTreeNode
{
	BTDataType data; //每个节点的数据
 
	struct BinaryTreeNode* left; //指向左子树的指针
 
	struct BinaryTreeNode* right; //指向右子树的指针
}BTNode;
 
// 申请新节点
BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
 
	// 判断是否申请成功
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
 
	// 初始化
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
 
	return newnode;
}
 
BTNode* CreatBinaryTree1()
{
	BTNode* n1 = BuyNode(1);
    assert(n1);
    BTNode* n2 = BuyNode(2);
    assert(n2);
    BTNode* n3 = BuyNode(3);
    assert(n3);
    BTNode* n4 = BuyNode(2);
    assert(n4);
    BTNode* n5 = BuyNode(4);
    assert(n5);
    BTNode* n6 = BuyNode(3);
    assert(n6);
    BTNode* n7 = BuyNode(4);
    assert(n7);
	
	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;
	n2->right = n7;

	return n1;
}

代码实现

代码演示:

bool _isSymmetric(BTNode* leftRoot, BTNode* rightRoot)
{
	if (leftRoot == NULL && rightRoot == NULL)
		return true;

	if (leftRoot == NULL || rightRoot == NULL)
		return false;

	if (leftRoot->data != rightRoot->data)
		return false;

	return _isSymmetric(leftRoot->left, rightRoot->right) && _isSymmetric(leftRoot->right, rightRoot->left);
}
bool isSymmetric(BTNode* root)
{
	if (root == NULL)
		return true;

	return _isSymmetric(root->left, root->right);
}

代码解析:

要判断一棵树是否是对称二叉树,那么就要让左右子树同时走,才能判断,也就是要有左右子树两个参数才能判断,所以 isSymmetric 这个函数不能满足要求,需要再定义一个子函数 _isSymmetric 来判断是否对称
第一个 if 语句用于判断两个 root 是否为空,并且和下面的其他 if 语句是相辅相成的,如果下面的 if 语句都没有返回的 false 的话,那么两个 root 同时走到空了就说明对应节点是对称的
第二三个 if 语句用于排除非对称的情况,返回 false
最后再递归两个 root 的左右子树,并且用逻辑与关联,只有一方不为 true ,那么就说明不对称,另一方就不用再递归下去

代码验证:

当树是对称二叉树时:

当树不是对称二叉树时: 

标签:NULL,return,oj,BTNode,right,二叉树,数据结构,left
From: https://blog.csdn.net/weixin_55341642/article/details/143628207

相关文章

  • 实现链式结构二叉树
    目录需要实现的操作链式结构二叉树实现结点的创建前序遍历中序遍历后序遍历计算结点个数计算二叉树的叶子结点个数 计算二叉树第k层结点个数计算二叉树的深度查找值为x的结点 销毁层序遍历判断是否为完全二叉树 总结需要实现的操作//前序遍历voidPreOr......
  • LevOJ.sln - 第三期
    LevOJ平台.slnP1943内存不够了问题描述解决方法#include<stdio.h>#include<stdlib.h>enum{N=100000};intmain(){intn,m;scanf("%d%d",&n,&m);char**text=malloc(n*sizeof(char*));for(inti=0;......
  • 每日一题之二叉树
    已知结点元素值为正整数且值不相同的一棵二叉树。该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。输入一个整数x,针对此二叉树编写程序求出x的右子树中所有结点值的和(若x不在树上,输出-1)。 输入说明:第一行输入某二叉树的先序遍历序列第二行输入该二叉树的中序遍历......
  • 数据结构[2016]
    一、设有二维数组A[6][8],每个元素占6个字节存储,实现存放,A[0][0]的起始地址为1000,计算:(10分)(1)数组最后一个元素A[5][7]的起始地址;(2)按行优先存放时,元素A[1][4]的起始地址;(3)按列优先存放时,元素A[4][7]的起始地址。二、若有一棵二叉树,左右子树均有三个结点,其左子树的前......
  • 数据结构大作业-计算机实践课程
    目录源码数据结构报告系统功能框图及说明开发环境系统主要功能运行效果截图创建一条含整数节点的无序链表链表节点的输出链表节点的升序排序分别计算链表中奇数和偶数点之和并输出释放链表源码#include<iostream>#include<string>usingnamespacestd;ty......
  • Python中的数据结构:collections库详解
    Python中的数据结构:collections库详解在日常Python开发中,我们经常需要处理各种数据结构。Python标准库自带的collections模块,为我们提供了一系列高效且灵活的容器数据类型,比基础数据结构(如list,dict,set,tuple)功能更丰富,应用场景更广泛。本文将详解collections......
  • python中常见的8种数据结构之一列表
    列表是Python中最常见的数据结构之一。它是一种有序的集合,可以包含不同类型的数据。以下是列表的一些特点和常见操作:1.定义列表:可以使用方括号([])来定义一个空列表,也可以在方括号中添加元素来初始化列表。  示例:```my_list=[]```或者```my_list=[1,2,3]```2.......
  • python中常见的8种数据结构之一数组的应用
    在Python中,数组是一种常见的数据结构,用于存储一系列相同类型的元素。在实际应用中,数组可以用于解决各种问题。以下是数组在Python中的一些常见应用:1.存储和访问数据:数组可以用于存储和访问一组数据。可以通过索引访问数组中的元素,也可以使用切片操作来获取数组的子集。2.......
  • 3174 含K个3的数( oj )
    描述输入两个正整数m和k。判断m能否被19整除,且恰好含有k个3。如果满足条件,则输出YES;否则,输出NO。例如,输入:438333,满足条件,输出YES。如果输入:393313,尽管有3个3,但不能被19整除,也不满足条件,应输出NO。输入描述m和k的值,中间用单个空格间隔。输出描述满足条件时输出"YES",......
  • 根据二叉树创建字符串
    题目:606.根据二叉树创建字符串-力扣(LeetCode)给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空......