输入字符序列,建立二叉树;按先序、中序、后序遍历二叉树(三种递归算法和中序遍历的非递归算法);并求二叉树的高度和结点的个数。
时间: 2024-05-06 20:14:52 浏览: 106
好的,这是一个比较经典的二叉树问题。我来逐步讲解一下。
## 建立二叉树
首先,我们需要输入一个字符序列,然后根据这个序列建立二叉树。这里我们假设字符序列中的每个字符都是一个节点的值,如果字符为'#',则表示该节点为空节点。
建立二叉树的方法是递归地建立左右子树。具体来说,我们按照先序遍历的顺序读入字符序列,每读入一个字符,就创建一个节点,并分别递归建立左右子树。
下面是代码实现:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def build_tree_helper(nodes):
if not nodes:
return None
val = nodes.pop(0)
if val == '#':
return None
root = TreeNode(val)
root.left = build_tree_helper(nodes)
root.right = build_tree_helper(nodes)
return root
def build_tree(s):
nodes = s.split()
return build_tree_helper(nodes)
```
这里我们使用了一个辅助函数 `build_tree_helper`,它以字符序列 `nodes` 为参数,返回根据 `nodes` 建立的二叉树。在 `build_tree_helper` 中,我们首先弹出序列中的第一个字符,如果该字符为 '#',则返回空节点;否则,创建一个节点,并递归地建立左右子树,最后返回根节点。`build_tree` 函数则是将输入的字符串转换为字符序列,并调用 `build_tree_helper`。
## 遍历二叉树
接下来,我们需要实现三种递归遍历算法和一种非递归的中序遍历算法。
### 先序遍历
先序遍历的顺序是:根节点 -> 左子树 -> 右子树。因此,我们可以先访问根节点,然后递归遍历左子树和右子树。
下面是代码实现:
```python
def preorder_traversal(root):
if not root:
return []
res = [root.val]
res += preorder_traversal(root.left)
res += preorder_traversal(root.right)
return res
```
### 中序遍历
中序遍历的顺序是:左子树 -> 根节点 -> 右子树。因此,我们可以先递归遍历左子树,然后访问根节点,最后递归遍历右子树。
下面是代码实现:
```python
def inorder_traversal(root):
if not root:
return []
res = inorder_traversal(root.left)
res += [root.val]
res += inorder_traversal(root.right)
return res
```
### 后序遍历
后序遍历的顺序是:左子树 -> 右子树 -> 根节点。因此,我们可以先递归遍历左子树和右子树,最后访问根节点。
下面是代码实现:
```python
def postorder_traversal(root):
if not root:
return []
res = postorder_traversal(root.left)
res += postorder_traversal(root.right)
res += [root.val]
return res
```
### 中序遍历(非递归)
非递归的中序遍历算法需要借助一个栈来实现。具体来说,我们从根节点开始,将所有左子树节点入栈,然后不断弹出栈顶元素,并将其右子树节点入栈。
下面是代码实现:
```python
def inorder_traversal_iterative(root):
if not root:
return []
stack = []
res = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
res.append(root.val)
root = root.right
return res
```
## 求二叉树的高度和结点个数
最后,我们需要求二叉树的高度和结点个数。求二叉树的高度可以通过递归地求左右子树的高度,然后取其较大值并加一得到。求二叉树的结点个数可以通过递归地求左右子树的结点个数,并将其相加,然后加上根节点的一个。
下面是代码实现:
```python
def get_height(root):
if not root:
return 0
left_height = get_height(root.left)
right_height = get_height(root.right)
return max(left_height, right_height) + 1
def get_node_count(root):
if not root:
return 0
left_count = get_node_count(root.left)
right_count = get_node_count(root.right)
return left_count + right_count + 1
```
这样,我们就完成了二叉树的建立、遍历、求高度和结点个数等操作。
阅读全文
相关推荐

















