帮我写一段二叉树的深度遍历代码
时间: 2023-08-06 13:14:40 浏览: 84
当然可以,以下是二叉树的深度遍历(先序遍历)代码:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def preorderTraversal(root):
if not root:
return []
stack, res = [root], []
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
```
这里使用了一个栈来进行遍历,先将根节点压入栈中,然后每次弹出一个节点并将其值加入结果中。接着将其右子节点压入栈中,再将其左子节点压入栈中。因为栈的特性是先进后出,所以先压入左子节点再压入右子节点,可以保证先遍历左子树再遍历右子树。
相关问题
写一段平衡二叉树中深度优先搜索的代码
以下是平衡二叉树中深度优先搜索的代码(使用递归实现):
```
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class AVLTree:
def __init__(self):
self.root = None
def insert(self, val):
self.root = self._insert(self.root, val)
def _insert(self, node, val):
if not node:
return Node(val)
if val < node.val:
node.left = self._insert(node.left, val)
else:
node.right = self._insert(node.right, val)
node = self._balance(node)
return node
def _balance(self, node):
if not node:
return node
# 计算平衡因子
balance_factor = self._height(node.left) - self._height(node.right)
# 如果平衡因子小于-1,说明右子树高度较高,需要左旋转
if balance_factor < -1:
# 如果右子树的左子树高度大于右子树的右子树高度,需要先右旋转
if self._height(node.right.left) > self._height(node.right.right):
node.right = self._right_rotate(node.right)
node = self._left_rotate(node)
# 如果平衡因子大于1,说明左子树高度较高,需要右旋转
elif balance_factor > 1:
# 如果左子树的右子树高度大于左子树的左子树高度,需要先左旋转
if self._height(node.left.right) > self._height(node.left.left):
node.left = self._left_rotate(node.left)
node = self._right_rotate(node)
return node
def _left_rotate(self, node):
new_root = node.right
node.right = new_root.left
new_root.left = node
return new_root
def _right_rotate(self, node):
new_root = node.left
node.left = new_root.right
new_root.right = node
return new_root
def _height(self, node):
if not node:
return 0
return 1 + max(self._height(node.left), self._height(node.right))
def dfs(self):
res = []
self._dfs(self.root, res)
return res
def _dfs(self, node, res):
if not node:
return
res.append(node.val)
self._dfs(node.left, res)
self._dfs(node.right, res)
```
其中,`_dfs` 方法使用递归实现深度优先搜索,返回一个列表,表示遍历的结果。在遍历每个节点时,将节点的值添加到结果列表中,然后递归遍历左子树和右子树。
java 二叉树深度优先遍历
Java实现二叉树的深度优先遍历可以使用递归或者栈来实现。递归方法比较简单,可以按照先序遍历、中序遍历和后序遍历的方式进行深度优先遍历。下面是一段示例代码,演示了Java中使用递归实现深度优先遍历的方法:
```
public class BinaryTree {
// 定义二叉树节点类
public class TreeNode {
public TreeNode leftNode;
public TreeNode rightNode;
public Integer val;
public TreeNode(Integer val) {
this.val = val;
}
}
// 深度优先遍历-先序遍历
public void startErgodic(TreeNode node) {
if (node == null) {
return;
}
System.out.print(node.val + " ");
startErgodic(node.leftNode);
startErgodic(node.rightNode);
}
// 深度优先遍历-中序遍历
public void midErgodic(TreeNode node) {
if (node == null) {
return;
}
midErgodic(node.leftNode);
System.out.print(node.val + " ");
midErgodic(node.rightNode);
}
// 深度优先遍历-后序遍历
public void endErgodic(TreeNode node) {
if (node == null) {
return;
}
endErgodic(node.leftNode);
endErgodic(node.rightNode);
System.out.print(node.val + " ");
}
// 二叉树的插入操作
public void insert(Integer val) {
// 插入操作的具体实现代码
}
// 二叉树的递归插入操作
public void insertDigui(Integer val, TreeNode node) {
// 递归插入操作的具体实现代码
}
// 广度优先遍历
public void Order() {
// 广度优先遍历的具体实现代码
}
}
public class Test {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
// 创建二叉树并进行插入操作
// 深度优先遍历-先序遍历
binaryTree.startErgodic(binaryTree.root);
System.out.println();
// 深度优先遍历-中序遍历
binaryTree.midErgodic(binaryTree.root);
System.out.println();
// 深度优先遍历-后序遍历
binaryTree.endErgodic(binaryTree.root);
}
}
```
上述代码中的`startErgodic()`方法实现了二叉树的深度优先遍历先序遍历,`midErgodic()`方法实现了中序遍历,`endErgodic()`方法实现了后序遍历。可以根据需要选择相应的方法进行遍历。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Java实现二叉树的深度优先遍历和广度优先遍历算法示例](https://download.csdn.net/download/weixin_38518885/12761000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [java有序二叉树的深度优先遍历和广度优先遍历](https://blog.csdn.net/m566666/article/details/122280365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文