前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重生之“我打数据结构,真的假的?”--4.二叉树

重生之“我打数据结构,真的假的?”--4.二叉树

作者头像
用户11286441
发布2024-09-23 19:12:25
1050
发布2024-09-23 19:12:25
举报
文章被收录于专栏:学习

1.对称二叉树

. - 力扣(LeetCode)

思路 : 1.设置两个队列l,r,先将root的左节点入l,右节点入r。 2.分别出队,若出队元素相同 Queuepush(&l, front->left); Queuepush(&l, front->right); Queuepush(&r, behind->right); Queuepush(&r, behind->left); 若不同则返回false 3.直至两队列都为空,返回true

代码语言:javascript
复制
typedef struct TreeNode* datatype;

 typedef struct Queuenode
{
	datatype data;
	struct Queuenode * next;
}Qnode;

typedef struct QT
{
	Qnode* head;
	Qnode* tail;
	int size;
}QT;

void QueueInit(QT* sl)
{
	assert(sl);
	sl->head = NULL;
	sl->tail = NULL;
	sl->size = 0;
}

bool Queueempty(QT* sl)
{
	assert(sl);
	return sl->head ==NULL;
}

void Queuepush(QT* sl, datatype x)
{
	assert(sl);
	Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
	newnode->next = NULL;
	newnode->data = x;
	if (Queueempty(sl))
	{
		sl->head = newnode;
		sl->tail = newnode;
	}
	else
	{
		sl->tail->next = newnode;
		sl->tail = newnode;
	}
	sl->size++;
}

void Queuepop(QT* sl)
{
	assert(sl);
	assert(!Queueempty(sl));
	Qnode* next = sl->head->next;
	free(sl->head);
	sl->head = next;
	sl->size--;
}

datatype Queuetop(QT* sl)
{
	assert(sl);
	assert(!Queueempty(sl));
	return sl->head->data;
}


void Queuedestroy(QT* sl)
{
	assert(sl);
	while (!Queueempty(sl))
		Queuepop(sl);
	sl->head = sl->tail = NULL;
	sl->size = 0;
}

 
bool isSymmetric(struct TreeNode* root) {
    if(root==NULL)
    return true;
   QT l;
   QT r;
  QueueInit(&l);
  QueueInit(&r);
  Queuepush(&l,root->left);
  Queuepush(&r,root->right);
while (!Queueempty(&r)&&!Queueempty(&l))
{
	struct TreeNode* front = Queuetop(&r);
    struct TreeNode* behind = Queuetop(&l);
	if((front!=NULL&&behind!=NULL)&&front->val==behind->val)
    { Queuepop(&r);
        Queuepop(&l);
        if(front)
	    {
	        Queuepush(&l, front->left);
	        Queuepush(&l, front->right);
	        Queuepush(&r, behind->right);
	        Queuepush(&r, behind->left);
        }
    }
    else if(front==NULL&&behind==NULL)
    {
        Queuepop(&r);
        Queuepop(&l);
    }
    else if((front!=NULL&&behind==NULL)||(front==NULL&&behind!=NULL))
    return false;
    else
    return false;
}

    if(Queueempty(&r)&&Queueempty(&l))
    return true;
    else
    return false;
}

2.平衡二叉树

. - 力扣(LeetCode)

判断「平衡二叉树」的 2 个条件: 1. 是「二叉排序树」 2. 任何一个节点的左子树或者右子树都是「平衡二叉树」(左右高度差小于等于 1)

思路: 1.分别找出根节点的左子树高和右子树高(递归),若相差大于1; 则一定不是AVL树;

代码语言:javascript
复制
int BTreeheight(struct TreeNode* root,int* i)
{
    int flag;
	if (root == NULL)
	{
		return 0;
	}

	int leftHeight = BTreeheight(root->left,i);
	int rightHeight= BTreeheight(root->right,i);
    if(leftHeight>=rightHeight)
    flag=leftHeight-rightHeight;
    else
    flag=rightHeight-leftHeight;
    if(flag>1)
    {*i=flag;}
    return  fmax(leftHeight , rightHeight ) + 1;
}



bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
    return true;
    int i=0;
    int height=BTreeheight(root,&i);
    if(i>1)
    return false;
    else
    return true;
}

3.翻转二叉树

. - 力扣(LeetCode)

思路: 1.左右节点交换,然后递归左节点与右节点

代码语言:javascript
复制
void change(struct TreeNode* root)
{
   if(root)
   {
      struct TreeNode* flag=root->left;
      root->left=root->right;
      root->right=flag;
   
      change(root->left);
      change(root->right);
   }
}

4.另一棵树的子树

. - 力扣(LeetCode)

思路: 1.需要先写判断两颗树是否相等的函数 bool isSameTree(struct TreeNode* p, struct TreeNode* q) 2. (1)如果root==NULL;返回false (2)如果isSameTree(root, subroot) 返回true (3)递归 isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot); (必须是||,只要左子树或右子树有一个和subroot相同即可)

代码语言:javascript
复制
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    int i=0;
    if(p==NULL&&q==NULL)
     return true;
    if((p==NULL&&q!=NULL)||(p!=NULL&&q==NULL))
    return false;
    if(p->val!=q->val)
    return false;
    else
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    
}
       
       
        bool isSubtree(struct TreeNode * root, struct TreeNode * subRoot) {
            if(root==NULL)
            return false;
            if(isSameTree(root, subRoot))
            return true;
            return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
        }

5.中序遍历建立二叉树

二叉树遍历_牛客题霸_牛客网

思路: 1.用arr存储字符串,并初始化二叉树BTnode* node 2.建立函数 void newbuynode(BTnode*& L, char* arr, int* i) (这里使用了c++的引用,如果没有引用就得传二级指针,而且不方便) 3.if (L == NULL && arr[*i] != '#') //开辟空间并存储数据 4. else if (arr[*i] != '#') L->data = arr[*i]; (*i)++; //当前数据存储完后要跳向下一位 5. if (L) { newbuynode(L->left, arr, i); newbuynode(L->right, arr, i); } //反义就是如果该节点为空,而且也不需要存储数据,那么就不用递归了

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
using namespace std;

typedef struct BinaryTree {
    char data;
    struct BinaryTree* left;
    struct BinaryTree* right;
} BTnode;

void newbuynode(BTnode*& L, char* arr, int* i) {
    if (arr[*i] != '\0') {
        if (L == NULL && arr[*i] != '#') {
            BTnode* node = (BTnode*)malloc(sizeof(BTnode));
            node->data = arr[*i];
            node->left = NULL;
            node->right = NULL;
            L = node;
        } else if (arr[*i] != '#')
            L->data = arr[*i];
        (*i)++;
        if (L) {
            newbuynode(L->left, arr, i);
            newbuynode(L->right, arr, i);
        }
    }
}

void midorder(BTnode*
              root) {      //前序排列(根,左子树,右子树)递归思想

    if (root == NULL) {
        return ;
    } else {
        midorder(root->left);
        printf("%c ",root->data);   //  根
        midorder(root->right);       //右子树
    }
}

int main() {

BTnode* node = (BTnode*)malloc(sizeof(BTnode));
node->data = 0;
node->left = NULL;
node->right = NULL;
char arr[100];
int i = 0;
cin.get(arr, 100);
newbuynode(node, arr, &i);
midorder(node);
return 0;

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.对称二叉树
  • 2.平衡二叉树
  • 3.翻转二叉树
  • 4.另一棵树的子树
  • 5.中序遍历建立二叉树
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档