二叉树的遍历在前文二叉树的基本操作已经提到,接下来再分享一些二叉树的其他操作
1.二叉树的创建
给一个二叉树的先序遍历结果,空节点用”#”表示,然后进行创建
实现代码:
TreeNode* CreateTreeNode(TreeNodeType value)
{
TreeNode* new_node = (TreeNode*)malloc(sizeof(TreeNode));
new_node->data = value;
new_node->lchild = NULL;
new_node->rchild = NULL;
return new_node;
}
TreeNode* _TreeCreate(TreeNodeType data[],size_t size,size_t* index,TreeNodeType null_node)
{
if(index == NULL)
{
return NULL;
}
if((*index) >= size)
{
return NULL;
}
if(data[*index] == null_node)
{
return NULL;
}
TreeNode* new_node = CreateTreeNode(data[*index]);
++(*index);
new_node->lchild = _TreeCreate(data,size,index,null_node);
++(*index);
new_node->rchild = _TreeCreate(data,size,index,null_node);
return new_node;
}
TreeNode* TreeCreate(TreeNodeType data[],size_t size,char null_node)
{
size_t index = 0;//表示当前取数组的哪个元素
return _TreeCreate(data,size,&index,null_node);
}
测试代码:
void TestCreate()
{
TEST_HEADER;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
printf("\n先序遍历:");
TreePreOrder(root);
printf("\n中序遍历:");
TreeInOrder(root);
printf("\n后序遍历:");
TreePostOrder(root);
printf("\n层序遍历:");
TreeLevelOrder(root);
printf("\n");
return;
}
运行结果:
2.克隆一个二叉树
给一个二叉树,克隆出来一个一模一样的二叉树
这里需要解释一下:一般的Clone为深拷贝,Copy为浅拷贝
那么深浅拷贝的区别又是什么呢??
浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
实现代码:
TreeNode* TreeClone(TreeNode* root)
{
if(root == NULL)
{
return NULL;
}
TreeNode* new_node = CreateTreeNode(root->data);
new_node->lchild = TreeClone(root->lchild);
new_node