【剑指Offer学习】【面试题19 :二叉树的镜像】
2018-01-30 本文已影响10人
果哥爸
题目:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
思路:
先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。
代码:
树节点:
#import <Foundation/Foundation.h>
// 树节点
@interface NSBinaryTreeNode : NSObject
// 值
@property (nonatomic, strong) NSString *value;
// 左节点
@property (nonatomic, strong) NSBinaryTreeNode *left;
// 右节点
@property (nonatomic, strong) NSBinaryTreeNode *right;
@end
#import "NSBinaryTreeNode.h"
#import <Foundation/Foundation.h>
void mirrorBinaryTree (NSBinaryTreeNode *binaryTreeNode) {
if (binaryTreeNode == nil) {
return;
}
NSBinaryTreeNode *tmpTreeNodel = binaryTreeNode.left;
binaryTreeNode.left = binaryTreeNode.right;
binaryTreeNode.right = tmpTreeNodel;
mirrorBinaryTree(binaryTreeNode.left);
mirrorBinaryTree(binaryTreeNode.right);
}
// 中序 遍历 打印
void printBinaryTree (NSBinaryTreeNode *headerTreeNode) {
if (headerTreeNode != nil) {
printBinaryTree(headerTreeNode.left);
NSLog(@"%@ ", headerTreeNode.value);
printBinaryTree(headerTreeNode.right);
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 8
// / \
// 6 10
// / \ / \
// 5 7 9 11
NSBinaryTreeNode *root = [NSBinaryTreeNode new];
root.value = @"8";
root.left = [NSBinaryTreeNode new];
root.left.value = @"6";
root.left.left = [NSBinaryTreeNode new];
root.left.left.value = @"5";
root.left.right = [NSBinaryTreeNode new];
root.left.right.value = @"7";
root.right = [NSBinaryTreeNode new];
root.right.value = @"10";
root.right.left = [NSBinaryTreeNode new];
root.right.left.value = @"9";
root.right.right = [NSBinaryTreeNode new];
root.right.right.value = @"11";
printBinaryTree(root);
mirrorBinaryTree(root);
printBinaryTree(root);
}
return 0;
}