1051: 输出利用先序遍历创建的二叉树中的指定结点的孩子结点java实现

本文探讨了Java中使用BufferedInputStream跳过特定字节的问题,以及内部类在不同上下文中访问的限制。面对SWUST平台上的挑战,文章深入分析了skipNbytes方法的缺失及替代方案,并解释了No enclosing instance of type Main is accessible错误的原因与解决办法。

可能是jdk版本问题,SWUST上面的没有skipNbytes();这个方法。错了一百遍。。。。。,虽然有这个题用这个跳过\r\n也是错的,因为第二行还有其他的空白符且在要被搜索的字符之前
用bufferedinputStream的话它是一次性将所有输入读入缓冲区,虽然还不知道缓冲区是个啥,
** No enclosing instance of type Main is accessible. Must qualify the allocation with an enclosing instance of type Main (e.g. x.new A() where x is an instance of Main).这句话是提示内部类要在外部类的main里面使用内部类要定义成static,因为静态方法不可以直接调用动态方法 **
在这里插入图片描述

import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedInputStream in = new BufferedInputStream(System.in);
//		char c = (char) in.read();
//		node t = new node(c);
		node t = new node().creattree(in);
		//in.skipNBytes(2L);
//		in.close();
		char c = (char) in.read();
		while(c==' '||c=='\n'||c=='\r') c = (char) in.read();
		
		t.find(t, c);
		
	}

	public static class node {
		char ch;
		node R, L;

		node(char ch) {
			super();
			this.ch = ch;
		}
		node() {
		}

		public void find(node t, char c) {
			if (t == null)
				return;
			if (t.ch == c) {
				if (t.L == null)
					System.out.print("L:#");
				else
					System.out.print("L:" + t.L.ch);
				if (t.R == null)
					System.out.print(",R:#");
				else
					System.out.print(",R:" + t.R.ch);
				return;
			}
			find(t.L, c);
			find(t.R, c);
		}

		public node creattree(BufferedInputStream in) throws IOException {
			char c = (char) in.read();
			node t;
			if (c == '#') {
				return t = null;
			} else {
				t = new node(c);
			}
			t.L = creattree(in);
			t.R = creattree(in);
			return t;
		}

	}

}

### C++ 中通过序遍历构建二叉树并计算指定节点的度数 #### 构建二叉树 在 C++ 中,可以通过序遍历来构建一棵二叉树。假设输入是一个数组形式的序序列,并使用特殊字符(如 `#` 或 `-1`)表示空节点,则可以按照如下方式实现: ```cpp #include <iostream> #include <vector> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int data) : val(data), left(nullptr), right(nullptr) {} }; TreeNode* buildTreeFromPreorder(vector<string>& preorder, int& index) { if (index >= preorder.size() || preorder[index] == "#") { // 判断是否为空节点 return nullptr; } TreeNode* root = new TreeNode(stoi(preorder[index])); // 创建当前节点 ++index; // 移动到下一个位置 root->left = buildTreeFromPreorder(preorder, index); // 递归构建左子树 root->right = buildTreeFromPreorder(preorder, index); // 递归构建右子树 return root; } ``` 此函数的核心逻辑是从给定的序序列中依次读取值来创建节点,并递归地为其分配左右子树。 --- #### 计算指定节点的度数 对于任意给定的节点,其 **度数** 定义为该节点拥有的非空子节点数量。因此,可以通过简单的条件判断来获取某个节点的度数: ```cpp int getDegree(TreeNode* node) { if (!node) return -1; // 如果节点不存在,返回非法值 int degree = 0; if (node->left != nullptr) degree++; // 左子节点存在则加一度 if (node->right != nullptr) degree++; // 右子节点存在则再加一度 return degree; } ``` 上述代码实现了对单个节点的度数计算功能。 --- #### 主程序示例 下面提供了一个完整的主程序示例,展示如何从序序列构建二叉树以及查询特定节点的度数: ```cpp void printTree(TreeNode* root) { if (!root) return; cout << root->val << " "; printTree(root->left); printTree(root->right); } int main() { vector<string> preorder = {"1", "2", "4", "#", "#", "5", "#", "#", "3", "6", "#", "#"}; // 输入序序列 int index = 0; TreeNode* root = buildTreeFromPreorder(preorder, index); cout << "建成的二叉树(前序): "; printTree(root); cout << endl; // 查询指定节点的度数 TreeNode* targetNode = root->left; // 假设要查询的是根节点的左孩子 if (targetNode) { cout << "目标节点 (" << targetNode->val << ") 的度数为: " << getDegree(targetNode) << endl; } else { cout << "目标节点不存在!" << endl; } return 0; } ``` 在此例子中,我们定义了一棵由字符串向量组成的序序列,并将其转换成实际的二叉树结构。随后调用了 `getDegree()` 函数以获得某节点的度数[^1]。 --- #### 输出解释 如果运行以上代码片段,将会得到类似以下的结果: ``` 建成的二叉树(前序): 1 2 4 5 3 6 目标节点 (2) 的度数为: 2 ``` 这表明成功构建了二叉树,并正确计算出了节点 `2` 的度数为 `2`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值