已知二叉树Node定义如下, 现在需要设计一个方法交换左子树和右子树, 下列方法中, 可以实现交换的是? ()
class Node {
public:
Node* left;
Node* right;
char content;
Node(char content);
private:
Node(const Node&);
Node& operator=(const Node& node);
};
A.void swap(Node root) {Node* temp=root.left;root.left=root.right;root.right=temp;}
B.void swap(Node& left, Node& right) {Node temp=left; left=right;right=temp;}
C.void swap(Node* left, Node* right) {Node* temp=left; left=right;right=temp;}
D.void swap(Node*& left, Node*& right) {Node* temp=left; left=right;right=temp;}
参考答案:D.
要交换二叉树的左右子树的方法可以有两种方法:
第一种是传递的参数根结点,选项A就是这种方法,不过根结点的类型应该是Node * ,即需更正为void swap(Node *root) {Node* temp=root->left;root->left=root->right;root->right=temp;},否则修改的只是实参的副本,并不能真正修改实参。不懂的话去看一下参数传递的三种方式(值传递,指针传递,引用传递),这里的D选项就是值传递,值传递的只是实参的一个副本,函数对参数的修改只是体现在实参的副本上并不会体现在实参上。A选项中参数类型错误
第二种是直接传递左右子树,二叉树的左右孩子都是指针类型,要修改指针类型的变量应该用指针的指针(**)或者指针的引用(*&)类型,BC的参数类型错误,所以只有D选项是正确的
怎么没能早点看到你这篇文章呢
这是我一直没记住的一个重点