二叉树题集(持续更新中)

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。

1. 求二叉搜索树最大深度

输入格式:输入给出一行整数序列作为二叉搜索树的键值,数字间以空格分隔,输入0结束(0不计入该二叉树键值)。

输入样例:8 6 8 5 10 9 11 0

输出样例:4

常规的求二叉搜索树深度的做法是递归到叶子结点往上求深度,对每个父节点求其左右子树的最大深度,即

1private int deep(TreeNode node) { 2 if (node == null) { 3 return 0; 4 } else { 5 int leftdeep = deep(node.left); 6 int rightdeep = deep(node.right); 7 8 return Math.max(leftdeep, rightdeep) + 1; 9 } 10 }

而这题实际上可以在建树的过程中对每个结点求深度,最终遍历出最大深度。完整代码如下

1public class TreeTest { 2 public static int depth = 0; 3 public static void main(String[] args) { 4 Scanner in = new Scanner(System.in); 5 int t; 6 Node root = null; 7 while ((t = in.nextInt()) != 0) { 8 root = create(root, t, 1); 9 } 10 System.out.println(depth); 11 } 12 13 public static Node create(Node root, int data, int d) { 14 15 if (root == null) { 16 if (d > depth) depth = d; 17 return new Node(data, null, null, d); 18 } 19 if (data < root.data) root.left = create(root.left, data, d + 1); 20 else root.right = create(root.right, data, d + 1); 21 return root; 22 } 23} 24 25class Node { 26 public Node(int data, Node left, Node right, int d) { 27 this.data = data; 28 this.left = left; 29 this.right = right; 30 this.d = d; 31 } 32 33 int data; 34 int d; 35 Node left; 36 Node right; 37}

2. 搜索树判断

题目描述

如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。

输出格式:输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,行尾不能有多余的空格。

输入样例

17 28 6 8 5 10 9 11

输出样例:NO

输入样例

17 28 6 5 7 10 8 11

输出样例

1YES 25 7 6 8 11 10 8
1#include <bits/stdc++.h> 2using namespace std; 3typedef struct Node 4{ 5 int data; 6 Node *left = NULL; 7 Node *right = NULL; 8 Node(int d) : data(d) {} 9} * Tree; 10Tree tree = NULL; 11void create(Tree &tree, int data) 12{ 13 if (!tree) 14 { 15 tree = new Node(data); 16 return; 17 } 18 if (data < tree->data) 19 create(tree->left, data); 20 else 21 create(tree->right, data); 22} 23void rcreate(Tree &tree, int data) 24{ 25 if (!tree) 26 { 27 tree = new Node(data); 28 return; 29 } 30 if (data < tree->data) 31 rcreate(tree->right, data); 32 else 33 rcreate(tree->left, data); 34} 35 36int n, a[1005], b[1005], cnt = 0; 37void preOrder(Tree root) 38{ 39 if (root == NULL) 40 return; 41 b[cnt++] = root->data; 42 preOrder(root->left); 43 preOrder(root->right); 44} 45void postOrder(Tree root, int flag) 46{ 47 if (root == NULL) 48 return; 49 if (flag == 1) 50 { 51 postOrder(root->left, flag); 52 postOrder(root->right, flag); 53 } 54 else 55 { 56 postOrder(root->right, flag); 57 postOrder(root->left, flag); 58 } 59 cout << root->data; 60 if (root != tree) 61 cout << " "; 62} 63 64int main() 65{ 66 cin >> n; 67 for (int i = 0; i < n; i++) 68 cin >> a[i]; 69 for (int i = 0; i < n; i++) 70 create(tree, a[i]); //根减而治之,递归建树 71 preOrder(tree); 72 int flag = 0; 73 if (equal(begin(a), end(a), begin(b), end(b))) 74 flag = 1; 75 if (!flag) 76 { 77 Tree tree = NULL; 78 cnt = 0; 79 for (int i = 0; i < n; i++) 80 rcreate(tree, a[i]); 81 preOrder(tree); 82 if (equal(begin(a), end(a), begin(b), end(b))) 83 flag = 2; 84 } 85 if (flag) 86 { 87 cout << "YES" << endl; 88 postOrder(tree, flag); 89 } 90 else 91 cout << "NO"; 92}

本文转自 https://blog.csdn.net/guanguandaren/article/details/108687374,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

PTA 是否同一棵二叉搜索树(25 分)

是否同一棵二叉搜索树(25 分)给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2,1,3}和{2,3,1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测

树与二叉树

二叉树层次建树二叉树(BinaryTree)是由有限个结点组成的集合,它或者为空集合,或者仅含一个根结点,或者由一个根结点和两棵互不相交的左、右子树组成。树为空即根节点为空。二叉树的基本形态如下图:a:空的二叉树,treeNULL。b:只有空节点的二叉树,

PTA 7

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。输入格式:输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。输出格式:将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一

动图图解二叉查找树的基本原理及其实现

本文为系列专题的第12篇文章。1.2.3.4.5.6.7.8.9.10.1.是什么?二叉查找树(BinarySearchTree)必须满足以下特点:若左子树不为空,则左子树的所有结点值皆小于根结点值若右子树不为空,则右子树的所有结点值皆大于根结点值左右子树也是二叉排序树如下图,是一颗二叉查找树:如果你对二叉查找树进行中序

Java实现 LeetCode 814 二叉树剪枝 (遍历树)

814\.二叉树剪枝给定二叉树根结点root,此外树的每个结点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。(节点X的子树为X本身,以及所有X的后代。)示例1:输入:\1,null,0,0,1\输出:\1,null,0,null,1\解释: