层序遍历:
思路:
使用层序遍历的方法:
将根节点入队,然后将根节点的左节点和右节点交换,每次for循环都执行“如果左节点不为空则将左节点入队,如果右节点不为空就将右节点入队,队头出队,将队头的左右结点交换,然后队头的左右节点不为空,将队头的左右结点入队。
1 void ceng(Node* node, vector<vector<int>>& result) { 2 queue<Node*>qu; 3 qu.push(node); 4 Node* temp = node; 5 int size = 0; 6 //只有temp为空的情况下采取判断st是否为空 7 while (!qu.empty()) { 8 size = qu.size(); 9 vector<int>vec; 10 for (int i = 0; i < size; i++) { 11 temp = qu.front(); 12 vec.push_back(temp->data_); 13 qu.pop(); 14 if (temp->left) { 15 qu.push(temp->left); 16 } 17 if (temp->right) { 18 qu.push(temp->right); 19 } 20 } 21 result.push_back(vec); 22 } 23 } 24 void change(Node* node) { 25 queue<Node*>qu; 26 if (node == nullptr) return; 27 qu.push(node); 28 Node* change; 29 Node* temp; 30 int size = 0; 31 //只有temp为空的情况下采取判断st是否为空 32 while (!qu.empty()) { 33 size = qu.size(); 34 for (int i = 0; i < size; i++) { 35 temp = qu.front(); 36 qu.pop(); 37 change = temp->left; 38 temp->left = temp->right; 39 temp->right = change; 40 if (temp->left) { 41 qu.push(temp->left); 42 } 43 if (temp->right) { 44 qu.push(temp->right); 45 } 46 } 47 } 48 } 49 int main() { 50 Node* node1 = new Node(6); 51 Node* node2 = new Node(3); 52 Node* node3 = new Node(9); 53 Node* node4 = new Node(1); 54 Node* node5 = new Node(4); 55 Node* node6 = new Node(8); 56 Node* node7 = new Node(0); 57 node1->left = node2; 58 node1->right = node3; 59 node2->left = node4; 60 node2->right = node5; 61 node3->left = node6; 62 node4->left = node7; 63 vector<vector<int>>result; 64 change(node1); 65 ceng(node1, result); 66 for (auto& v : result) { 67 for (auto& in : v) { 68 cout << in << endl; 69 } 70 } 71 }
前序遍历:
将根节点的左右子节点进行交换,然后对左子树进行翻转,然后再对右子树进行翻转(规模更小的子问题)
1 void change(Node* node) { 2 if (node == nullptr) return; 3 Node* temp; 4 temp = node->left; 5 node->left = node->right; 6 node->right = temp; 7 change(node->left); 8 change(node->right); 9 }