나무 - 두 갈래 나무 두루 다니기

생각


반복은 실제적으로 어떤 순서에 따라 결점을 방문하는데 비교적 전형적인 것은 선순, 중순, 후순, 층순 등이 있다.두 갈래 나무는 천연적으로 자 구조를 가지고 있다. 즉, 왼쪽 갈래 나무와 오른쪽 갈래 나무는 똑같이 두 갈래 나무로 규모가 더 작을 뿐이다.두 갈래 나무의 세 가지 역행 방식

1.1 선순


창고 S;p= root; while(p | | S가 비어 있지 않음) {while(p) {p 노드에 접근하기; p의 오른쪽 트리가 S에 들어가기;//오른쪽 트리 p = p의 왼쪽 트리를 임시로 저장하기;    }     p = S.top; 아웃소싱//오른쪽 트리 처리}
vector preorderTraversal(TreeNode* root) {
	vector vec;
	stack stk;
	while (root || !stk.empty()) {
		while (root) {
			vec.push_back(root->val); // 
			stk.push(root->right);
			root = root->left; // 
		}
		root = stk.top(); stk.pop(); // 
	} // 
	return vec;
}

1.2중서


창고 S;p= root; while (p | | S가 비어 있지 않음) {while (p) {p in S;p = p의 왼쪽 트리;//왼쪽 트리 방문} p = S.top 창고;액세스 p;//루트 p = p의 오른쪽 하위 트리 액세스;//오른쪽 하위 트리에 액세스하십시오.}
vector inorderTraversal(TreeNode* root) {
	vector vec;
	stack stk;
	while (root || !stk.empty()) {//root , ;stk , 
		while (root) {
			stk.push(root);
			root = root->left;
		}// 
		root = stk.top(); stk.pop(); // , 
		vec.push_back(root->val); // ( ) 
		root = root->right; // 
	}
	return vec;
}

1.3 후순


왼쪽 트리->오른쪽 트리->뿌리.뒤서열이 두루 돌아다니는 것이 가장 어려운데, 왜?뿌리는 마지막에 창고에서 나온 것이다.순환으로 이루어지면왼쪽 트리를 처리하기 전에 뿌리 결점을 창고에 넣어야 한다.창고 꼭대기 원소를 얻은 후 오른쪽 나무를 처리할 것인가 아니면 뿌리를 직접 처리할 것인가를 판단해야 한다.여기에서 포인터prev가 방문한 결점을 가리키는 매우 교묘한 방법을 사용합니다.
vector postorderTraversal(TreeNode* root) {
	vector vec;
	stack stk;
	TreeNode *prev = nullptr;
	while (root || !stk.empty()) {
		while (root) {
			stk.push(root);
			root = root->left;
		} // 
		root = stk.top(); // 
		if (root->right && root->right != prev) { // 
			root = root->right;
		}
		else { // , 
			vec.push_back(root->val);
			stk.pop();
			prev = root; // 
			root = nullptr; //  
		}
	} // 
	return vec;
}

좋은 웹페이지 즐겨찾기