首页 > 其他分享 >二叉数

二叉数

时间:2023-09-10 23:35:21浏览次数:54  
标签:lchild BT return 二叉 bt rchild copiedBt

一.展示

1.1. 代码

#include<stdio.h>
#include<stdlib.h>
#define max 100000

typedef struct binaryTree {
	struct binaryTree* lchild, *rchild;
	char vaule;
}BT;

BT *queen[max];
int front = 0, rear = 0;

//初始化
void init(BT** bt) {
	*bt = (BT*)malloc(sizeof(BT));
	(*bt)->lchild = (*bt)->rchild = NULL;
}

//判断是否为空
int isEmpty(BT* bt) {
	return bt ? 1 : 0;
}
//建立二叉树1
void createBinaryTree(BT** bt) {
	char ch;
	scanf("%c", &ch);
	if (ch == '#') *bt = NULL;
	else {
		*bt = (BT*)malloc(sizeof(BT));
		(*bt)->vaule = ch;
		createBinaryTree(&((*bt)->lchild));
		createBinaryTree(&((*bt)->rchild));
	}
}

//建立二叉树2
BT* createBinaryTree1(BT* bt) {
	char ch;
	scanf("%c", &ch);
	if (ch == '#') bt = NULL;
	else {
		if (!bt) {
			bt = (BT*)malloc(sizeof(BT));
			bt->lchild = bt->rchild = NULL;
		}
		bt->vaule = ch;
		bt->lchild=createBinaryTree1(bt->lchild);
		bt->rchild=createBinaryTree1(bt->rchild);
	}
	return bt;
}

//先序遍历
void preorderTraversal(BT* bt) {
	if (bt) {
		printf("%c", bt->vaule);//改一个地方就成了另外两种遍历方式——中序和后序
		preorderTraversal(bt->lchild);
		preorderTraversal(bt->rchild);
	}
}

//层序遍历
void sequenceTraversal(BT* bt) {
	queen[rear] = bt;
	rear++;
	while (rear - front != 0) {
		printf("%c", queen[front]->vaule);
		if (queen[front]->lchild) queen[rear++] = queen[front]->lchild;
		if (queen[front]->rchild) queen[rear++] = queen[front]->rchild;
		front++;
	}
}

//复制二叉树
BT* copy(BT* copyBt, BT* copiedBt) {
	if (copyBt) {
		if (!copiedBt) {
			copiedBt = (BT*)malloc(sizeof(BT));
			copiedBt->lchild = copiedBt->rchild = NULL;
		}
		copiedBt->vaule = copyBt->vaule;
		copiedBt->lchild = copy(copyBt->lchild, copiedBt->lchild);
		copiedBt->rchild = copy(copyBt->rchild, copiedBt->rchild);
	}
	return copiedBt;
}

//求层数
int depth(BT* bt) {
	int n, m;
	if (!bt) return 0;
	else {
		n = depth(bt->lchild);
		m = depth(bt->rchild);
		if (n > m)
			return n + 1;
		else
			return m + 1;
	}
}

//求节点个数
int nodeCount(BT* bt) {
	if (!bt) return 0;
	return nodeCount(bt->lchild) + nodeCount(bt->rchild) + 1;
}

//求叶子节点
int leavesCount(BT* bt) {
	if (!bt)
		return 0;
	if (!bt->lchild && !bt->rchild)
		return 1;
	else
		return leavesCount(bt->lchild) + leavesCount(bt->rchild);
}

//ABC##DE#G##F###
int main() {
	BT* bt = NULL;
	init(&bt);
	createBinaryTree1(bt);
	printf("前序遍历:");
	preorderTraversal(bt);
	printf("\ndepth = %d", depth(bt));
	printf("\nnode count = %d", nodeCount(bt));
	BT* copiedBt = NULL;
	init(&copiedBt);
	copy(bt,copiedBt);
	printf("\ncopying:");
	preorderTraversal(copiedBt);
	printf("\n层序遍历:");
	sequenceTraversal(bt);
	printf("\nleaves count:%d", leavesCount(bt));
	return 0;
}

1.2.结果

二.心得

1.建立一个二叉树

因为单独的一个前序或者中序或者后序遍历法不能唯一的确定一个二叉树,但如果能用一种表示方法去将所有节点包括其左右子树的空节点也全部表示出来,那么便能唯一表示一颗二叉树。
例如:测试用例:ABC##DE#G##F###

2.遍历二叉树

遍历有四种遍历方式:前序、中序、后序、层序四种遍历法

3.复制二叉树

按前序遍历的方式对应复制

4.求层数

递归找到左右子树的层数,取较大者+1

5.求节点个数

递归找到左右子树的节点个数,左子树个数+右子树+1

6.求叶子节点个数

递归找左右子树的叶子节点,左子树叶子节点个数+右子树叶子节点个数

标签:lchild,BT,return,二叉,bt,rchild,copiedBt
From: https://www.cnblogs.com/cony1/p/17692097.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:翻转二叉树
    题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]代码实现:classSolution{publicTreeNodeinvertTree(TreeNoderoot){......
  • 二叉树(顺序存储要维护关系)
                    ......
  • 二叉树的便利
         ......
  • 代码随想录:● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98
     654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个......
  • Java版剑指offer:平衡二叉树
    Java版剑指offer:平衡二叉树描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(BalancedBinaryTree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉......
  • java版本剑指offer:在二叉树中找到两个节点的最近公共祖先
    java版本剑指offer:在二叉树中找到两个节点的最近公共祖先描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值o1和o2,请找到o1和o2的最近公共祖先节点。注:本题保证二叉树中每个节点的val值均不相同。示例1输入:[3,5,1,6,2,0,8,#,#,7,4],5,1返回值:3方法一:递......
  • 二叉树遍历
    #include<stdio.h>#include<stdlib.h>//定义typedefstructBiTNode{intdata;//数据域structBiTNode*lchild,*rchild;}BiTNode,*BiTree;//创建新节点boolcreateNode(BiTree&T,intvalue){T=(BiTNode*)malloc(sizeof(BiTNode));......
  • [刷题记录Day 23]Leetcode二叉树
    No.1题目修剪二叉搜索树思路递归法有点抽象,要对具体案例做模拟才好懂递归分析返回值:节点,参数:节点,[下界,上界]终止条件:遇到空节点,返回空单层递归逻辑:判断不在范围内的情况:当前节点小于下界/大于上界,直接返回右/左子树递归结果;若在范围内,则递归筛查左右子树,返回当前节点......
  • 剑指 Offer 54. 二叉搜索树的第k大节点
    题目链接:剑指Offer54.二叉搜索树的第k大节点题目描述:给定一棵二叉搜索树,请找出其中第k大的节点的值。解法思路:由于题目中二叉树是二叉搜索树(中序遍历是升序的),要求的是第k大的节点值,也就是倒数第k个数,因此可以转换一下遍历顺序,按照右->根->左的顺序进行遍历的话,得......
  • 二叉树 层序
    相关阅读:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_102-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86层序遍历即二叉树的广度优先遍历,使用队列先进先出的特性。#层序遍......