二叉树系列(4)趣图_二叉树的轴对称树

给定一个二叉树,创建一颗新的二叉树,使得新树和原树具有轴对称关系。比如把下面左图中的树经过轴对称变化改为下面右图中的树。

二叉树系列(4)趣图_二叉树的轴对称树_第1张图片

从树的结构看,适合仿照递归遍历的思路,完成新树的创建,这里和递归遍历不同的是,每次需要记录一下当前节点的父节点的信息,要不然没法链成一颗树。

copy_t为原树中待拷贝的节点,parent_t为新树中的拷贝副本节点的父节点。is_left判断当前进行拷贝的节点为parent_t的左孩子还是右孩子。

参考如下:

link mirror_tree(link parent_t,link copy_t, int is_left)
{
	if(!copy_t)
		return NULL;
	link new_root=make_node(copy_t->item);
	if(parent_t!=NULL&&is_left==1)//当前节点不是根节点,且是parent的左孩子
		parent_t->l=new_root;
	if(parent_t!=NULL&&is_left==0)//当前节点不是根节点,且是parent的右孩子
		parent_t->r=new_root;		
	mirror_tree(new_root, copy_t->r, 1);
	mirror_tree(new_root, copy_t->l, 0);
	return new_root;
	
}

然后在这里http://cslibrary.stanford.edu/110/BinaryTrees.html看到了更简洁的实现,不过这里是把原树进行了轴对称变换,而不是创建了新树进行轴对称变化。

void mirror(struct node* node) { 
  if (node==NULL) { 
    return; 
  } 
  else { 
    struct node* temp;

    // do the subtrees 
    mirror(node->left); 
    mirror(node->right);

    // swap the pointers in this node 
    temp = node->left; 
    node->left = node->right; 
    node->right = temp; 
  } 
} 

完整的cpp程序可以参考上一篇文章, 二叉树系列(3)层序遍历的非递归实现


你可能感兴趣的:(二叉树系列(4)趣图_二叉树的轴对称树)