用Java实现二叉树的层次遍历使用递归和广度优先

·如何实现一个二叉树的层次遍历:
方法一使用递归(借助辅助参数level)

public class cengCiErChaShu {
	//使用递归
	List<List<Integer>> list = new ArrayList<>();
	public List<List<Integer>> levelOrder(TreeNode root){
		if(root == null) {
			return list;
		}
		helper(root,0);
		return list;
	}
	public void helper(TreeNode root, int level) {
		//查看是否有这一层,没有创建一个新的List
		if(list.size() == level) {
			list.add(new ArrayList<Integer>());
		}
		list.get(level).add(root.val);
		//进行该节点的左子节点
		if(root.left != null) {
			//进入到下层进行遍历
			helper(root.left, level + 1);
		}
		//进行右子节点的
		if(root.right  != null) {
			helper(root.right, level + 1);
		}
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二叉树层次遍历是指按照树的层次一层一层地遍历二叉树的节点。层次遍历的顺序通常是从上到下,从左到右。 以下是用递归实现二叉树层次遍历的 C 语言代码的核心部分: ``` void levelOrder(struct TreeNode* root) { if (root == NULL) return; int h = height(root); for (int i = 1; i <= h; i++) printGivenLevel(root, i); } void printGivenLevel(struct TreeNode* root, int level) { if (root == NULL) return; if (level == 1) printf("%d ", root->val); else if (level > 1) { printGivenLevel(root->left, level-1); printGivenLevel(root->right, level-1); } } int height(struct TreeNode* root) { if (root == NULL) return 0; else { int lheight = height(root->left); int rheight = height(root->right); if (lheight > rheight) return lheight+1; else return rheight+1; } } ``` 在这段代码中,我们定义了三个函数: - `levelOrder` 函数用于对二叉树进行层次遍历。 - `printGivenLevel` 函数用于打印给定层的所有节点的值。 - `height` 函数用于计算二叉树的高度。 在 `levelOrder` 函数中,我们首先检查根节点是否为空。如果为空,则直接返回。否则,我们调用 `height` 函数计算二叉树的高度,然后循环调用 `printGivenLevel` 函数来打印每一层的节点。 在 `printGivenLevel` 函数中,我们首先检查根节点是否为空。如果 ### 回答2: 二叉树层次遍历是一种广度优先的遍历方式,主要通过队列实现。虽然要求使用递归实现,但递归本身并不适用于层次遍历,因为递归会将当前层的所有节点都处理完再递归到下一层,而这与层次遍历的逻辑并不一致。因此,用递归实现二叉树层次遍历并不是最优的选择。以下是一个用递归实现层次遍历的示例代码: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* createNode(int val) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); newNode->val = val; newNode->left = NULL; newNode->right = NULL; return newNode; } int getHeight(struct TreeNode* root) { if (root == NULL) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1; } void printCurrentLevel(struct TreeNode* root, int level) { if (root == NULL) { return; } if (level == 1) { printf("%d ", root->val); } else if (level > 1) { printCurrentLevel(root->left, level - 1); printCurrentLevel(root->right, level - 1); } } void levelOrderTraversal(struct TreeNode* root) { int height = getHeight(root); for (int i = 1; i <= height; i++) { printCurrentLevel(root, i); } } int main() { struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); printf("层次遍历结果为:"); levelOrderTraversal(root); return 0; } ``` 上述代码中,`TreeNode`结构体表示二叉树的节点,`createNode`函数用于创建一个新的节点,`getHeight`函数用于计算二叉树的高度,`printCurrentLevel`函数用于按层打印当前层的节点,`levelOrderTraversal`函数用于进行层次遍历,`main`函数中创建了一个示例二叉树并进行层次遍历打印。 ### 回答3: 二叉树层次遍历是一种广度优先搜索(BFS)的算法,它的实现可以用递归。下面是用C语言实现二叉树层次遍历的核心代码: ```c #include<stdio.h> #include<stdlib.h> // 二叉树结点的定义 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 获取二叉树的高度 int getHeight(TreeNode* root) { if (root == NULL) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1); } // 递归打印二叉树指定层的结点 void printLevel(TreeNode* root, int level) { if (root == NULL) { return; } if (level == 1) { printf("%d ", root->val); } else if (level > 1) { printLevel(root->left, level - 1); printLevel(root->right, level - 1); } } // 递归层次遍历二叉树 void levelOrderTraversal(TreeNode* root) { int height = getHeight(root); int i; for (i = 1; i <= height; i++) { printLevel(root, i); } } int main() { // 创建二叉树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = NULL; root->left->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 3; root->right->left = NULL; root->right->right = NULL; // 层次遍历二叉树 levelOrderTraversal(root); return 0; } ``` 以上代码定义了二叉树结点 `TreeNode`,包括结点值 `val`、左子树指针 `left` 和右子树指针 `right`。`getHeight` 函数用于获取二叉树的高度。`printLevel` 函数用于递归打印二叉树指定层的结点。`levelOrderTraversal` 函数用于遍历二叉树的所有层次。在 `main` 函数中创建了一个简单的二叉树,并调用 `levelOrderTraversal` 函数进行层次遍历。 以上代码递归地遍历二叉树的每个结点,并按层次打印结点值。最终的输出结果是按层次遍历二叉树结点值序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值