对任意给定的二叉树完成下列操作: (1)根据输入的序列,建立二叉链表存储结构; (2)输出该二叉树的先序、中序、后序遍历结果(递归算法); (3)先序遍历二叉树(非递归算法); (4)借助队列实现二叉树的层次
时间: 2023-11-30 18:02:49 浏览: 98
数据结构第六章课件及建立二叉树的二叉链表存储结构汇总
遍历。
好的,这是一个关于二叉树的问题,我将根据您的问题逐步回答:
1. 根据输入的序列,建立二叉链表存储结构
为了建立二叉链表存储结构,我们需要定义一个二叉树的节点结构体,包含一个数据域和两个指针域(分别指向左子树和右子树)。
```
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(NULL), right(NULL){}
};
```
然后我们需要读入序列并建立二叉树。假设输入的序列为一个数组,数组中的-1表示空节点,那么我们可以通过递归的方式建立二叉树。
```
TreeNode* buildTree(vector<int>& nums, int& index){
if(index >= nums.size() || nums[index] == -1){
index++;
return NULL;
}
TreeNode* node = new TreeNode(nums[index]);
index++;
node->left = buildTree(nums, index);
node->right = buildTree(nums, index);
return node;
}
TreeNode* buildTree(vector<int>& nums){
int index = 0;
return buildTree(nums, index);
}
```
2. 输出该二叉树的先序、中序、后序遍历结果(递归算法)
二叉树的三种遍历方式分别是先序遍历、中序遍历和后序遍历。我们可以通过递归的方式实现这三种遍历方式。
先序遍历的顺序是先遍历根节点,再遍历左子树,最后遍历右子树。
```
void preorder(TreeNode* root){
if(root == NULL) return;
cout << root->val << " ";
preorder(root->left);
preorder(root->right);
}
```
中序遍历的顺序是先遍历左子树,再遍历根节点,最后遍历右子树。
```
void inorder(TreeNode* root){
if(root == NULL) return;
inorder(root->left);
cout << root->val << " ";
inorder(root->right);
}
```
后序遍历的顺序是先遍历左子树,再遍历右子树,最后遍历根节点。
```
void postorder(TreeNode* root){
if(root == NULL) return;
postorder(root->left);
postorder(root->right);
cout << root->val << " ";
}
```
3. 先序遍历二叉树(非递归算法)
我们可以使用一个栈来实现非递归的先序遍历。具体来说,从根节点开始,先将根节点压入栈中,然后弹出栈顶元素,输出该元素的值,并先后将其右子节点和左子节点压入栈中。一直重复这个过程,直到栈为空为止。
```
void preorderNonRecursive(TreeNode* root){
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
if(node == NULL) continue;
cout << node->val << " ";
st.push(node->right);
st.push(node->left);
}
}
```
4. 借助队列实现二叉树的层次遍历
二叉树的层次遍历可以使用一个队列来实现。从根节点开始,先将根节点入队,然后不停地执行以下操作:弹出队首元素,输出该元素的值,并将其左右子节点依次入队。直到队列为空为止。
```
void levelorder(TreeNode* root){
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* node = q.front();
q.pop();
if(node == NULL) continue;
cout << node->val << " ";
q.push(node->left);
q.push(node->right);
}
}
```
以上就是关于二叉树的一些基本操作,希望能够帮到您!
阅读全文