树与二叉树的转换代码
树和二叉树是数据结构中比较常见的两种形式,它们都具有根节点、子节点等基本概念。但它们之间有什么关联呢?在实际的应用中,我们有时需要将树转换为二叉树或者将二叉树转换为树,这时就需要了解树与二叉树的转换代码。
首先,我们来看看从树转换为二叉树的代码。在树中,每个节点可以有多个子节点,而在二叉树中,每个节点最多只能有两个子节点,因此需要将树上的节点调整为二叉树上的节点。一种比较常用的方法是将第一个子节点作为左子节点,其他的子节点作为右子节点。具体的代码实现如下:
```
struct Node{
int data; //数据
Node *left; //左子树
Node *right; //右子树
};
//Tree to binary tree
void treeToBinaryTree(TreeNode *root){
if(root == NULL){
return;
}
TreeNode *p = root;
if(p->children.size() > 0){
p->left = p->children[0];
}
TreeNode *q = p->left;
for(int i = 1; i < p->children.size(); i++){
q->right = p->children[i];
q = q->right;
}
//递归处理左右子树
treeToBinaryTree(root->left);
treeToBinaryTree(root->right);
}
```
上述代码中,我们把树上的节点放到二叉树上去,会有多个节点成为同一个节点的右子树。在这里,我们只保留第一个子节点作为左子树,其他子节点作为右子树,将右子树放到相应的位置上即可。
接着,我们来看看从二叉树转换为树的代码。在二叉树中,每个节点最多只能有两个子节点,而在树中,每个节点可以有多个子节点,这就需要将二叉树上的节点调整为树上的节点。一种比较常用的方法是将左子节点作为第一个子节点,右子节点作为其他子节点。具体的代码实现如下:
```
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//Binary tree to tree
TreeNode* binaryTreeToTree(TreeNode* root) {
if(!root) {
return NULL;
}
TreeNode* node = new TreeNode(root->val);
node->left = binaryTreeToTree(root->left);
node->right = NULL;
TreeNode* cur = node->left;
if(cur) {
while(cur->right) {
cur = cur->right;
}
cur->right = binaryTreeToTree(root->right);
} else {
node->right = binaryTreeToTree(root->right);
}
return node;
}
```
上述代码中,我们把二叉树上的左子节点作为第一个子节点,右子节点作为其他子节点,将子节点放到相应的位置上即可。
总结一下,树与二叉树的转换代码主要有两种,分别是从树转换为二叉树和从二叉树转换为树。在从树转换为二叉树的过程中,我们需要将第一个子节点作为左子树,其他子节点作为右子树,将右子树放到相应的位置上即可;在从二叉树转换为树的过程中,我们需要将左子节点作为第一个子节点,右子节点作为其他子节点,将子节点放到相应的位置上即可。