1、从尾到头逆向打印单链表
1 #include<vector> 2 3 using namespace std; 4 typedef struct Node{ 5 int num; 6 struct Node *next; 7 }ListNode; 8 9 class Solution{ 10 public: 11 vector<int> PrintTailtoHead(ListNode* head) 12 { 13 vector<int>res; 14 ListNode *p = head; 15 //每遍历一个元素放入vector容器中,然后逆序输出 16 if (p!=NULL) 17 { 18 res.push_back(p->num); 19 p = p->next; 20 } 21 //res.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素 22 //res.rend(),指向容器的第一个元素的前一个位置 23 return vector<int>(res.rbegin(),res.rend()); 24 25 } 26 };
2、前序中序重建二叉树
1 class Solution{ 2 public: 3 //记录节点位置 4 unordered_map<int, int>pos; 5 TreeNode * ConstructTree(vector<int>pre, vector<int>vin) 6 { 7 //一共有多少个节点 8 int con = pre.size(); 9 for (int i = 0; i < con; i++) 10 { 11 pos[vin[i]] = i;//记录中序的位置 12 } 13 return DFS(pre, vin, 0, con - 1, 0, con - 1); 14 } 15 TreeNode *DFS(vector<int>pre, vector<int>vin, int pl, int pr, int vl, int vr) 16 { 17 if (pl>pr) return NULL; //叶子 18 //根节点 19 TreeNode *root = new TreeNode(pre[pl]); 20 //左子树长度 21 int k = pos[vin[pl]] - vl; 22 23 root->left = DFS(pre, vin, pl + 1, pl + k, vl, vl + k-1); 24 root->right = DFS(pre, vin, pl + k + 1, pr, vl + k + 1, vr); 25 26 return root; 27 } 28 };
3、找出某个节点的中序遍历顺序的下一个节点
case1:如果该节点有右子树,则其下一个节点是其右子树的最左边的节点;例如F
case2: 如果该节点没有右子树,1)该节点如果是根节点,则没有后继节点;
2)该节点是其父节点的左孩子,后继节点为其父节点;例如H
3)该节点是其父节点的右孩子,向上找,找到第一个是左子节点的父节点,这个父节点的父节点就是其后继节点,例如D,如果找不到,说明没有后继节点,例如G
1 struct TreeNode 2 { 3 int val; 4 struct TreeNode *left, *right, *parent; 5 }; 6 class Solution{ 7 public: 8 TreeNode *FindNext(TreeNode*p) 9 { 10 //case1 右子树存在 11 if (p->right) 12 { 13 p = p->right; 14 while (p->left) 15 { 16 p = p->left; 17 } 18 return p; 19 } 20 //case 2 右子树不存在 21 //不是根节点 22 while (p->parent) 23 { 24 if (p = p->parent->left) 25 return p->parent; 26 p = p->parent; 27 } 28 return NULL; 29 30 } 31 32 }